﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using Entidades;
using Reglas_Negocio;

namespace Control_Evaluacion.COMPLEMENTO
{
    public class TablasBuilder
    {       
        public static DataTable[] DevuelveRegistroES5(DataTable list_fechas, string[] lista_ids)
        {

            DataRow fila;
            DataTable[] lst_datos = new DataTable[2];

            DataTable datos = new DataTable("ds_resumen_es");
            List<registro_es> list_registro_es;

            datos.Columns.Add(new DataColumn("id_ent_sal", typeof(int)));
            datos.Columns.Add(new DataColumn("fecha_ent_sal", typeof(DateTime)));
            datos.Columns.Add(new DataColumn("hora_madrugada_ent", typeof(DateTime)));
            datos.Columns.Add(new DataColumn("hora_madrugada_sal", typeof(DateTime)));
            datos.Columns.Add(new DataColumn("hora_matutina_ent", typeof(DateTime)));
            datos.Columns.Add(new DataColumn("hora_matutina_sal", typeof(DateTime)));
            datos.Columns.Add(new DataColumn("hora_vespertina_ent", typeof(DateTime)));
            datos.Columns.Add(new DataColumn("hora_vespertina_sal", typeof(DateTime)));
            datos.Columns.Add(new DataColumn("hora_nocturna_ent", typeof(DateTime)));
            datos.Columns.Add(new DataColumn("hora_nocturna_sal", typeof(DateTime)));
            datos.Columns.Add(new DataColumn("situacion_madrugada", typeof(string)));
            datos.Columns.Add(new DataColumn("situacion_matutina", typeof(string)));
            datos.Columns.Add(new DataColumn("situacion_vespertina", typeof(string)));
            datos.Columns.Add(new DataColumn("situacion_nocturna", typeof(string)));
            datos.Columns.Add(new DataColumn("descripcion_reg_salidas", typeof(string)));
            datos.Columns.Add(new DataColumn("id_huella_fk", typeof(int)));
            datos.Columns.Add(new DataColumn("id_cargahoraria_fk", typeof(int)));
            datos.Columns.Add(new DataColumn("id_empleado_fk", typeof(int)));

            datos.Columns.Add(new DataColumn("total_horas", typeof(DateTime)));
            datos.Columns.Add(new DataColumn("total_horas_ret", typeof(DateTime)));
            datos.Columns.Add(new DataColumn("total_horas_extra", typeof(DateTime)));
            datos.Columns.Add(new DataColumn("total_horas_suple", typeof(DateTime)));
            datos.Columns.Add(new DataColumn("total_horas_permiso", typeof(DateTime)));
            datos.Columns.Add(new DataColumn("total_horas_autorizado", typeof(DateTime)));
            datos.Columns.Add(new DataColumn("subtotal_horas", typeof(DateTime)));

            DataTable dt_salario = new DataTable("ds_salarios");

            dt_salario.Columns.Add(new DataColumn("id_salario", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("estado_salario", typeof(string)));
            dt_salario.Columns.Add(new DataColumn("fecha_registro_salario", typeof(DateTime)));
            dt_salario.Columns.Add(new DataColumn("id_empleado_fk", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("incluye_minutos", typeof(string)));
            dt_salario.Columns.Add(new DataColumn("nro_horas_mes", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("valor_por_salario", typeof(decimal)));
            dt_salario.Columns.Add(new DataColumn("valor_salario", typeof(decimal)));

            dt_salario.Columns.Add(new DataColumn("total_horas_s", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("total_minutos_s", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("total_horas_s_ret", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("total_minutos_s_ret", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("total_horas_s_extra", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("total_minutos_s_extra", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("total_horas_s_suple", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("total_minutos_s_suple", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("total_horas_s_permiso", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("total_minutos_s_permiso", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("total_horas_s_autorizado", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("total_minutos_s_autorizado", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("salario_a_pagar", typeof(decimal)));

            int cont = 1;

            double minutos_trab = 0;
            double minutos_total_trab = 0;

            //Es el resto entre la hora final de la carga horaria menos la hora final del registra de salida            
            double minutos_suple = 0;
            double minutos_total_suple = 0;

            //Es el resto entre la hora inicial del registro de entrada menos la hora inicial de la carga horaria            
            double minutos_ret = 0;
            double minutos_total_ret = 0;

            //Es el resto entre la hora final del registro de salida menos la hora final de la carga horaria            
            double minutos_extra = 0;
            double minutos_total_extra = 0;

            //Permisos            
            double minutos_permiso = 0;
            double minutos_total_permiso = 0;

            //Autorizaciones            
            double minutos_autorizado = 0;
            double minutos_total_autorizado = 0;

            List<totales_time> list_regs_trab = new List<totales_time>();

            totales_time reg_aux = new totales_time();
            string[] jornadas = new string[] { "NOCTURNA", "MATUTINA", "VESPERTINA"};

            int sueldo_id_ = 0;

            List<registro_es> reg_list_nocturna = new List<registro_es>();

            for (int j = 0; j < lista_ids.Length; j++)
            {
                if (!lista_ids[j].Equals("0"))
                {
                    minutos_total_trab = 0;
                    minutos_total_suple = 0;
                    minutos_total_ret = 0;
                    minutos_total_extra = 0;
                    minutos_total_permiso = 0;
                    minutos_total_autorizado = 0;

                    DateTime fecha_aux_ini = new DateTime();
                    DateTime fecha_aux_fin = new DateTime();
                    TimeSpan ret_hora_aux;
                    sueldo_id_ = 0;
                    int connnnnnn = 0;

                    empleados emp___ = empleadosBuilder.Recuperar_sin_joins("id_emp=" + lista_ids[j]);

                    for (int i = 0; i < list_fechas.Rows.Count; i++)
                    {
                        fila = datos.NewRow();

                        foreach (string jornad in jornadas)
                        {
                            DateTime fecha_noct_urna = new DateTime();
                            if (!jornad.Equals("NOCTURNA"))
                            {
                                list_registro_es = registro_esBuilder.ListarTodos_List_Join_Horario_Empresa(string.Format("registro_es.id_empleado_fk IN({0}) AND date(fecha_ent_sal)='{1}' AND horario_empresa.jornada='{2}'", lista_ids[j], ValidarBuilder.FormatoFechaSinHoraCompara(list_fechas.Rows[i]["fecha"]), jornad));
                                connnnnnn++;
                            }
                            else
                            {
                                list_registro_es = registro_esBuilder.ListarTodos_List_Join_Horario_Empresa(string.Format("registro_es.id_empleado_fk IN({0}) AND date(fecha_ent_sal)='{1}' AND (HOUR(hora_entrada_ent_sal)>'7') AND horario_empresa.jornada='{2}'", lista_ids[j], ValidarBuilder.FormatoFechaSinHoraCompara(list_fechas.Rows[i]["fecha"]), jornad));

                                if (connnnnnn == 0)
                                {
                                    reg_list_nocturna = registro_esBuilder.ListarTodos_List_Join_Horario_Empresa(string.Format("registro_es.id_empleado_fk IN({0}) AND date(fecha_ent_sal_fin)='{1}' AND (HOUR(hora_entrada_ent_sal)>='0' AND HOUR(hora_entrada_ent_sal)<='7' ) AND horario_empresa.jornada='{2}'", lista_ids[j], ValidarBuilder.FormatoFechaSinHoraCompara(list_fechas.Rows[i]["fecha"]), jornad));
                                    //foreach (registro_es reg_ in reg_list_nocturna)
                                    //    list_registro_es.Add(reg_);
                                    connnnnnn++;

                                    /////////////////////////////////////////////////////////////////////////////////////////////
                                    DataRow dr_fila = datos.NewRow();
                                    for (int g = 0; g < reg_list_nocturna.Count; g++)
                                    {
                                        sueldo_id_ = reg_list_nocturna[g].Id_salario_fk;
                                        ret_hora_aux = reg_list_nocturna[g].Hora_salida_ent_sal - reg_list_nocturna[g].Hora_entrada_ent_sal;
                                        //Horas trabajadas
                                        minutos_trab = minutos_trab + Math.Floor(ret_hora_aux.TotalMinutes);

                                        //Horas de retraso
                                        fecha_aux_ini = new DateTime(reg_list_nocturna[g].Hora_entrada_ent_sal.Year, reg_list_nocturna[g].Hora_entrada_ent_sal.Month, reg_list_nocturna[g].Hora_entrada_ent_sal.Day, reg_list_nocturna[g].Horario_empresa.Hora_inicio_hora.Hour, reg_list_nocturna[g].Horario_empresa.Hora_inicio_hora.Minute, reg_list_nocturna[g].Horario_empresa.Hora_inicio_hora.Second);
                                        ret_hora_aux = reg_list_nocturna[g].Hora_entrada_ent_sal - fecha_aux_ini;

                                        if (g == 0)
                                        {
                                            if (ret_hora_aux.TotalMinutes > 0 && emp___.Emp_entrada_especial.Equals("no"))
                                                minutos_ret = minutos_ret + Math.Floor(ret_hora_aux.TotalMinutes);
                                        }
                                        //Horas extra o suplementaria
                                        fecha_aux_fin = new DateTime(reg_list_nocturna[g].Hora_salida_ent_sal.Year, reg_list_nocturna[g].Hora_salida_ent_sal.Month, reg_list_nocturna[g].Hora_salida_ent_sal.Day, reg_list_nocturna[g].Horario_empresa.Hora_fin_hora.Hour, reg_list_nocturna[g].Horario_empresa.Hora_fin_hora.Minute, reg_list_nocturna[g].Horario_empresa.Hora_fin_hora.Second);
                                        ret_hora_aux = reg_list_nocturna[0].Hora_salida_ent_sal - fecha_aux_fin;

                                        if (ret_hora_aux.TotalMinutes > 0)
                                        {
                                            if (reg_list_nocturna[g].Tipo_trabajo.Equals("EXTRA"))
                                                minutos_extra = minutos_extra + Math.Floor(ret_hora_aux.TotalMinutes);
                                            if (reg_list_nocturna[g].Tipo_trabajo.Equals("SUPLEMENTARIA"))
                                                minutos_suple = minutos_suple + Math.Floor(ret_hora_aux.TotalMinutes);
                                        }
                                        else
                                        {
                                            //Horas permiso o autorizado salida
                                            ret_hora_aux = fecha_aux_fin - reg_list_nocturna[g].Hora_salida_ent_sal;

                                            if (reg_list_nocturna[g].Tipo_trabajo.Equals("PERMISO"))
                                                minutos_permiso = minutos_permiso + Math.Floor(ret_hora_aux.TotalMinutes);
                                            if (reg_list_nocturna[g].Tipo_trabajo.Equals("AUTORIZADO"))
                                                minutos_autorizado = minutos_autorizado + Math.Floor(ret_hora_aux.TotalMinutes);
                                        }

                                        dr_fila["hora_nocturna_ent"] = reg_list_nocturna[0].Hora_entrada_ent_sal;
                                        dr_fila["hora_nocturna_sal"] = reg_list_nocturna[g].Hora_salida_ent_sal;
                                        dr_fila["situacion_nocturna"] = reg_list_nocturna[g].Tipo_ent_sal;

                                        dr_fila["id_ent_sal"] = cont;
                                        dr_fila["fecha_ent_sal"] = reg_list_nocturna[0].Fecha_ent_sal;
                                        dr_fila["id_huella_fk"] = reg_list_nocturna[g].Id_huella_fk; //dt_matutina.Rows[0]["id_huella_fk"];
                                        dr_fila["id_cargahoraria_fk"] = reg_list_nocturna[g].Id_cargahoraria_fk; //dt_matutina.Rows[0]["id_cargahoraria_fk"];
                                        dr_fila["id_empleado_fk"] = reg_list_nocturna[g].Id_empleado_fk; //dt_matutina.Rows[0]["id_empleado_fk"];
                                        //descripcion_reg_salidas
                                        dr_fila["descripcion_reg_salidas"] = dr_fila["descripcion_reg_salidas"] + reg_list_nocturna[g].Descripcion_ent_sal + " ";
                                    }

                                    if (minutos_trab > 0)
                                    {
                                        double min_aux = (minutos_trab / 60);
                                        int new_hour = (int)Math.Floor(min_aux);
                                        int new_minute = (int)minutos_trab % 60;

                                        minutos_total_trab = minutos_total_trab + minutos_trab;
                                        DateTime total_fecha = new DateTime(fecha_aux_ini.Year, fecha_aux_ini.Month, fecha_aux_ini.Day, new_hour, new_minute, 0);

                                        dr_fila["total_horas"] = total_fecha;

                                        //RETRASO
                                        min_aux = (minutos_ret / 60);
                                        new_hour = (int)Math.Floor(min_aux);
                                        new_minute = (int)minutos_ret % 60;

                                        minutos_total_ret = minutos_total_ret + minutos_ret;
                                        total_fecha = new DateTime(fecha_aux_ini.Year, fecha_aux_ini.Month, fecha_aux_ini.Day, new_hour, new_minute, 0);

                                        if (minutos_ret > 0 && emp___.Emp_entrada_especial.Equals("no"))
                                            dr_fila["total_horas_ret"] = total_fecha;

                                        //EXTRA
                                        min_aux = (minutos_extra / 60);
                                        new_hour = (int)Math.Floor(min_aux);
                                        new_minute = (int)minutos_extra % 60;

                                        minutos_total_extra = minutos_total_extra + minutos_extra;
                                        total_fecha = new DateTime(fecha_aux_ini.Year, fecha_aux_ini.Month, fecha_aux_ini.Day, new_hour, new_minute, 0);

                                        if (minutos_extra > 0)
                                            dr_fila["total_horas_extra"] = total_fecha;

                                        //SUPLEMENTARIAS
                                        min_aux = (minutos_suple / 60);
                                        new_hour = (int)Math.Floor(min_aux);
                                        new_minute = (int)minutos_suple % 60;

                                        minutos_total_suple = minutos_total_suple + minutos_suple;
                                        total_fecha = new DateTime(fecha_aux_ini.Year, fecha_aux_ini.Month, fecha_aux_ini.Day, new_hour, new_minute, 0);

                                        if (minutos_suple > 0)
                                            dr_fila["total_horas_suple"] = total_fecha;

                                        //PERMISOS
                                        min_aux = (minutos_permiso / 60);
                                        new_hour = (int)Math.Floor(min_aux);
                                        new_minute = (int)minutos_permiso % 60;

                                        minutos_total_permiso = minutos_total_permiso + minutos_permiso;
                                        total_fecha = new DateTime(fecha_aux_ini.Year, fecha_aux_ini.Month, fecha_aux_ini.Day, new_hour, new_minute, 0);

                                        if (minutos_permiso > 0)
                                            dr_fila["total_horas_permiso"] = total_fecha;

                                        //AUTORIZACIONES SALIDAS
                                        min_aux = (minutos_autorizado / 60);
                                        new_hour = (int)Math.Floor(min_aux);
                                        new_minute = (int)minutos_autorizado % 60;

                                        minutos_total_autorizado = minutos_total_autorizado + minutos_autorizado;
                                        total_fecha = new DateTime(fecha_aux_ini.Year, fecha_aux_ini.Month, fecha_aux_ini.Day, new_hour, new_minute, 0);

                                        if (minutos_autorizado > 0)
                                            dr_fila["total_horas_autorizado"] = total_fecha;

                                        datos.Rows.Add(dr_fila);

                                        minutos_trab = 0;
                                        minutos_ret = 0;
                                        minutos_extra = 0;
                                        minutos_suple = 0;
                                        minutos_permiso = 0;
                                        minutos_autorizado = 0;
                                        cont++;
                                    }
                                    /////////////////////////////////////////////////////////////////////////////////////////////7
                                }

                                fecha_noct_urna = ValidarBuilder.devuelveFechaFin(Convert.ToDateTime(list_fechas.Rows[i]["fecha"]), 1);
                                reg_list_nocturna = registro_esBuilder.ListarTodos_List_Join_Horario_Empresa(string.Format("registro_es.id_empleado_fk IN({0}) AND date(fecha_ent_sal)='{1}' AND (HOUR(hora_entrada_ent_sal)>='0' AND HOUR(hora_entrada_ent_sal)<='7' ) AND horario_empresa.jornada='{2}'", lista_ids[j], ValidarBuilder.FormatoFechaSinHoraCompara(fecha_noct_urna), jornad));

                                foreach (registro_es reg_ in reg_list_nocturna)
                                    list_registro_es.Add(reg_);
                            }     
                            for (int g = 0; g < list_registro_es.Count; g++)
                            {
                                sueldo_id_ = list_registro_es[g].Id_salario_fk;
                                ret_hora_aux = list_registro_es[g].Hora_salida_ent_sal - list_registro_es[g].Hora_entrada_ent_sal;
                                //Horas trabajadas
                                minutos_trab = minutos_trab + Math.Floor(ret_hora_aux.TotalMinutes);

                                //Horas de retraso
                                fecha_aux_ini = new DateTime(list_registro_es[g].Hora_entrada_ent_sal.Year, list_registro_es[g].Hora_entrada_ent_sal.Month, list_registro_es[g].Hora_entrada_ent_sal.Day, list_registro_es[g].Horario_empresa.Hora_inicio_hora.Hour, list_registro_es[g].Horario_empresa.Hora_inicio_hora.Minute, list_registro_es[g].Horario_empresa.Hora_inicio_hora.Second);
                                ret_hora_aux = list_registro_es[g].Hora_entrada_ent_sal - fecha_aux_ini;

                                if (g == 0)
                                {
                                    if (ret_hora_aux.TotalMinutes > 0 && emp___.Emp_entrada_especial.Equals("no"))
                                        minutos_ret = minutos_ret + Math.Floor(ret_hora_aux.TotalMinutes);
                                }
                                //Horas extra o suplementaria
                                fecha_aux_fin = new DateTime(list_registro_es[g].Hora_salida_ent_sal.Year, list_registro_es[g].Hora_salida_ent_sal.Month, list_registro_es[g].Hora_salida_ent_sal.Day, list_registro_es[g].Horario_empresa.Hora_fin_hora.Hour, list_registro_es[g].Horario_empresa.Hora_fin_hora.Minute, list_registro_es[g].Horario_empresa.Hora_fin_hora.Second);
                                ret_hora_aux = list_registro_es[0].Hora_salida_ent_sal - fecha_aux_fin;

                                if (ret_hora_aux.TotalMinutes > 0)
                                {
                                    if (list_registro_es[g].Tipo_trabajo.Equals("EXTRA"))
                                        minutos_extra = minutos_extra + Math.Floor(ret_hora_aux.TotalMinutes);
                                    if (list_registro_es[g].Tipo_trabajo.Equals("SUPLEMENTARIA"))
                                        minutos_suple = minutos_suple + Math.Floor(ret_hora_aux.TotalMinutes);
                                }
                                else
                                {
                                    //Horas permiso o autorizado salida
                                    ret_hora_aux = fecha_aux_fin - list_registro_es[g].Hora_salida_ent_sal;

                                    if (list_registro_es[g].Tipo_trabajo.Equals("PERMISO"))
                                        minutos_permiso = minutos_permiso + Math.Floor(ret_hora_aux.TotalMinutes);
                                    if (list_registro_es[g].Tipo_trabajo.Equals("AUTORIZADO"))
                                        minutos_autorizado = minutos_autorizado + Math.Floor(ret_hora_aux.TotalMinutes);
                                }

                                if (jornad.Equals("MATUTINA"))
                                {
                                    fila["hora_matutina_ent"] = list_registro_es[0].Hora_entrada_ent_sal; // dt_matutina.Rows[0]["hora_entrada_ent_sal"];
                                    fila["hora_matutina_sal"] = list_registro_es[g].Hora_salida_ent_sal; //dt_matutina.Rows[0]["hora_salida_ent_sal"];
                                    fila["situacion_matutina"] = list_registro_es[g].Tipo_ent_sal; //dt_matutina.Rows[0]["tipo_ent_sal"];
                                }
                                if (jornad.Equals("VESPERTINA"))
                                {
                                    fila["hora_vespertina_ent"] = list_registro_es[0].Hora_entrada_ent_sal;
                                    fila["hora_vespertina_sal"] = list_registro_es[g].Hora_salida_ent_sal;
                                    fila["situacion_vespertina"] = list_registro_es[g].Tipo_ent_sal;
                                }
                                if (jornad.Equals("NOCTURNA"))
                                {
                                    fila["hora_nocturna_ent"] = list_registro_es[0].Hora_entrada_ent_sal;
                                    fila["hora_nocturna_sal"] = list_registro_es[g].Hora_salida_ent_sal;
                                    fila["situacion_nocturna"] = list_registro_es[g].Tipo_ent_sal;
                                }
                                if (jornad.Equals("MADRUGADA"))
                                {
                                    fila["hora_madrugada_ent"] = list_registro_es[0].Hora_entrada_ent_sal;
                                    fila["hora_madrugada_sal"] = list_registro_es[g].Hora_salida_ent_sal;
                                    fila["situacion_madrugada"] = list_registro_es[g].Tipo_ent_sal;
                                }
                                fila["id_ent_sal"] = cont;                                
                                fila["fecha_ent_sal"] = list_registro_es[0].Fecha_ent_sal;
                                fila["id_huella_fk"] = list_registro_es[g].Id_huella_fk; //dt_matutina.Rows[0]["id_huella_fk"];
                                fila["id_cargahoraria_fk"] = list_registro_es[g].Id_cargahoraria_fk; //dt_matutina.Rows[0]["id_cargahoraria_fk"];
                                fila["id_empleado_fk"] = list_registro_es[g].Id_empleado_fk; //dt_matutina.Rows[0]["id_empleado_fk"];
                                //descripcion_reg_salidas
                                fila["descripcion_reg_salidas"] = fila["descripcion_reg_salidas"] + list_registro_es[g].Descripcion_ent_sal + " ";
                            }
                        }
                        if (minutos_trab > 0)
                        {
                            double min_aux = (minutos_trab / 60);
                            int new_hour = (int)Math.Floor(min_aux);
                            int new_minute = (int)minutos_trab % 60;

                            minutos_total_trab = minutos_total_trab + minutos_trab;
                            DateTime total_fecha = new DateTime(fecha_aux_ini.Year, fecha_aux_ini.Month, fecha_aux_ini.Day, new_hour, new_minute, 0);

                            fila["total_horas"] = total_fecha;

                            //RETRASO
                            min_aux = (minutos_ret / 60);
                            new_hour = (int)Math.Floor(min_aux);
                            new_minute = (int)minutos_ret % 60;

                            minutos_total_ret = minutos_total_ret + minutos_ret;
                            total_fecha = new DateTime(fecha_aux_ini.Year, fecha_aux_ini.Month, fecha_aux_ini.Day, new_hour, new_minute, 0);

                            if (minutos_ret > 0 && emp___.Emp_entrada_especial.Equals("no"))
                                fila["total_horas_ret"] = total_fecha;

                            //EXTRA
                            min_aux = (minutos_extra / 60);
                            new_hour = (int)Math.Floor(min_aux);
                            new_minute = (int)minutos_extra % 60;

                            minutos_total_extra = minutos_total_extra + minutos_extra;
                            total_fecha = new DateTime(fecha_aux_ini.Year, fecha_aux_ini.Month, fecha_aux_ini.Day, new_hour, new_minute, 0);

                            if (minutos_extra > 0)
                                fila["total_horas_extra"] = total_fecha;

                            //SUPLEMENTARIAS
                            min_aux = (minutos_suple / 60);
                            new_hour = (int)Math.Floor(min_aux);
                            new_minute = (int)minutos_suple % 60;

                            minutos_total_suple = minutos_total_suple + minutos_suple;
                            total_fecha = new DateTime(fecha_aux_ini.Year, fecha_aux_ini.Month, fecha_aux_ini.Day, new_hour, new_minute, 0);

                            if (minutos_suple > 0)
                                fila["total_horas_suple"] = total_fecha;

                            //PERMISOS
                            min_aux = (minutos_permiso / 60);
                            new_hour = (int)Math.Floor(min_aux);
                            new_minute = (int)minutos_permiso % 60;

                            minutos_total_permiso = minutos_total_permiso + minutos_permiso;
                            total_fecha = new DateTime(fecha_aux_ini.Year, fecha_aux_ini.Month, fecha_aux_ini.Day, new_hour, new_minute, 0);

                            if (minutos_permiso > 0)
                                fila["total_horas_permiso"] = total_fecha;

                            //AUTORIZACIONES SALIDAS
                            min_aux = (minutos_autorizado / 60);
                            new_hour = (int)Math.Floor(min_aux);
                            new_minute = (int)minutos_autorizado % 60;

                            minutos_total_autorizado = minutos_total_autorizado + minutos_autorizado;
                            total_fecha = new DateTime(fecha_aux_ini.Year, fecha_aux_ini.Month, fecha_aux_ini.Day, new_hour, new_minute, 0);

                            if (minutos_autorizado > 0)
                                fila["total_horas_autorizado"] = total_fecha;

                            datos.Rows.Add(fila);

                            minutos_trab = 0;
                            minutos_ret = 0;
                            minutos_extra = 0;
                            minutos_suple = 0;
                            minutos_permiso = 0;
                            minutos_autorizado = 0;
                            cont++;
                        }
                        else
                        {
                            minutos_trab = 0;
                            minutos_ret = 0;
                            minutos_extra = 0;
                            minutos_suple = 0;
                            minutos_permiso = 0;
                            minutos_autorizado = 0;
                            cont++;
                        }
                    }
                    salarios salario_empleado = salariosBuilder.Recuperar(string.Format("id_salario='{0}' AND id_empleado_fk='{1}'", sueldo_id_, lista_ids[j]));
                    datos_globales datos_salario_glob = datos_globalesBuilder.Recuperar("id_dat_glob=" + salario_empleado.Id_dat_glob_fk);
                    if (salario_empleado.Id_salario > 0)
                    {
                        fila = dt_salario.NewRow();

                        fila["id_salario"] = salario_empleado.Id_salario;
                        fila["estado_salario"] = salario_empleado.Estado_salario;
                        fila["fecha_registro_salario"] = salario_empleado.Fecha_registro_salario;
                        fila["id_empleado_fk"] = salario_empleado.Id_empleado_fk;
                        fila["incluye_minutos"] = salario_empleado.Incluye_minutos;
                        fila["nro_horas_mes"] = salario_empleado.Nro_horas_mes;
                        fila["valor_por_salario"] = salario_empleado.Valor_por_salario;
                        fila["valor_salario"] = salario_empleado.Valor_salario;

                        double min_aux_total = (minutos_total_trab / 60);
                        int new_hour_total = (int)Math.Floor(min_aux_total);
                        int new_minute_total = (int)minutos_total_trab % 60;
                        int horas_suples_ = 0;
                        int minutos_suples_ = 0;

                        int horas_extras_ = 0;
                        int minutos_extras_ = 0;

                        int horas_trabs_ = 0;
                        int minutos_trabs_ = 0;

                        decimal salario_a_pagar = 0;

                        if (new_hour_total <= salario_empleado.Nro_horas_mes)
                        {
                            salario_a_pagar = (salario_empleado.Valor_salario / (decimal)salario_empleado.Nro_horas_mes) * (decimal)new_hour_total;
                            horas_trabs_ = new_hour_total;
                            minutos_trabs_ = new_minute_total;

                            if (salario_empleado.Incluye_minutos.Equals("si"))
                            {
                                decimal incluye_min = ((salario_empleado.Valor_salario / (decimal)salario_empleado.Nro_horas_mes) / 60) * (decimal)new_minute_total;
                                salario_a_pagar = salario_a_pagar + incluye_min;
                            }
                        }
                        else
                        {
                            salario_a_pagar = salario_empleado.Valor_salario;
                            horas_trabs_ = salario_empleado.Nro_horas_mes;
                            minutos_trabs_ = 0;

                            horas_suples_ = new_hour_total - salario_empleado.Nro_horas_mes;
                            minutos_suples_ = new_minute_total;

                            if (horas_suples_ <= datos_salario_glob.Nro_horas_suplementarias)
                            {
                                decimal valor_suple_horas =  (salario_empleado.Valor_salario/(decimal)salario_empleado.Nro_horas_mes ) *(1+ (datos_salario_glob.Porcent_suplementaria / 100));
                                decimal aux_suple__ = valor_suple_horas * (decimal)horas_suples_;
                                salario_a_pagar = salario_a_pagar + aux_suple__;

                                if (salario_empleado.Incluye_minutos.Equals("si"))
                                {
                                    decimal valor_suple_minutos = (valor_suple_horas / 60) ;
                                    aux_suple__ = valor_suple_minutos * (decimal)minutos_suples_;
                                    salario_a_pagar = salario_a_pagar + aux_suple__;
                                }
                            }
                            else
                            {
                                horas_suples_ = datos_salario_glob.Nro_horas_suplementarias;
                                minutos_suples_ = 0;

                                decimal valor_suple_horas = (salario_empleado.Valor_salario / (decimal)salario_empleado.Nro_horas_mes) * (1 + (datos_salario_glob.Porcent_suplementaria / 100));
                                decimal aux_suple__ = valor_suple_horas * (decimal)horas_suples_;
                                salario_a_pagar = salario_a_pagar + aux_suple__;

                                //if (salario_empleado.Incluye_minutos.Equals("si"))
                                //{
                                //    decimal valor_suple_minutos = (salario_empleado.Valor_por_salario / 60) * (decimal)minutos_suples_;
                                //    aux_suple__ = valor_suple_minutos + (valor_suple_minutos * (datos_salario_glob.Porcent_suplementaria / 100));
                                //    salario_a_pagar = salario_a_pagar + aux_suple__;
                                //}

                                horas_extras_ = new_hour_total - (datos_salario_glob.Nro_horas_suplementarias + salario_empleado.Nro_horas_mes);
                                minutos_extras_ = new_minute_total;

                                decimal valor_extra_horas = (salario_empleado.Valor_salario / (decimal)salario_empleado.Nro_horas_mes) * (1 + (datos_salario_glob.Porcent_extra / 100));
                                decimal aux_extra__ = valor_extra_horas * (decimal)horas_extras_;
                                salario_a_pagar = salario_a_pagar + aux_extra__;

                                if (salario_empleado.Incluye_minutos.Equals("si"))
                                {
                                    decimal valor_extra_minutos = (valor_extra_horas / 60);
                                    aux_extra__ = valor_extra_minutos*(decimal)minutos_extras_;
                                    salario_a_pagar = salario_a_pagar + aux_extra__;
                                }
                            }
                        }

                        fila["salario_a_pagar"] = salario_a_pagar;

                        if (horas_trabs_ > 0)
                            fila["total_horas_s"] = horas_trabs_;
                        if (minutos_trabs_ > 0)
                            fila["total_minutos_s"] = minutos_trabs_;

                        //RETRASO
                        min_aux_total = (minutos_total_ret / 60);
                        new_hour_total = (int)Math.Floor(min_aux_total);
                        new_minute_total = (int)minutos_total_ret % 60;

                        if (emp___.Emp_entrada_especial.Equals("no"))
                        {
                            if (new_hour_total > 0)
                                fila["total_horas_s_ret"] = new_hour_total;
                            if (new_minute_total > 0)
                                fila["total_minutos_s_ret"] = new_minute_total;
                        }

                        if (horas_extras_ > 0)
                            fila["total_horas_s_extra"] = horas_extras_;
                        if (minutos_extras_ > 0)
                            fila["total_minutos_s_extra"] = minutos_extras_;

                        if (horas_suples_ > 0)
                            fila["total_horas_s_suple"] = horas_suples_;
                        if (minutos_suples_ > 0)
                            fila["total_minutos_s_suple"] = minutos_suples_;

                        //PERMISO
                        min_aux_total = (minutos_total_permiso / 60);
                        new_hour_total = (int)Math.Floor(min_aux_total);
                        new_minute_total = (int)minutos_total_permiso % 60;

                        if (new_hour_total > 0)
                            fila["total_horas_s_permiso"] = new_hour_total;
                        if (new_minute_total > 0)
                            fila["total_minutos_s_permiso"] = new_minute_total;

                        //AUTORIZACIONES SALIDAS
                        min_aux_total = (minutos_total_autorizado / 60);
                        new_hour_total = (int)Math.Floor(min_aux_total);
                        new_minute_total = (int)minutos_total_autorizado % 60;

                        if (new_hour_total > 0)
                            fila["total_horas_s_autorizado"] = new_hour_total;
                        if (new_minute_total > 0)
                            fila["total_minutos_s_autorizado"] = new_minute_total;

                        dt_salario.Rows.Add(fila);
                    }
                }
            }
            lst_datos[0] = datos;
            lst_datos[1] = dt_salario;

            return lst_datos;
        }

        //Cambio anterior a 16/12/2011
        public static DataTable[] DevuelveRegistroES6(DataTable list_fechas, string[] lista_ids)
        {

            DataRow fila;
            DataTable[] lst_datos = new DataTable[2];

            DataTable datos = new DataTable("ds_resumen_es");
            List<registro_es> list_registro_es;

            datos.Columns.Add(new DataColumn("id_ent_sal", typeof(int)));
            datos.Columns.Add(new DataColumn("fecha_ent_sal", typeof(DateTime)));
            datos.Columns.Add(new DataColumn("hora_madrugada_ent", typeof(DateTime)));
            datos.Columns.Add(new DataColumn("hora_madrugada_sal", typeof(DateTime)));
            datos.Columns.Add(new DataColumn("hora_matutina_ent", typeof(DateTime)));
            datos.Columns.Add(new DataColumn("hora_matutina_sal", typeof(DateTime)));
            datos.Columns.Add(new DataColumn("hora_vespertina_ent", typeof(DateTime)));
            datos.Columns.Add(new DataColumn("hora_vespertina_sal", typeof(DateTime)));
            datos.Columns.Add(new DataColumn("hora_nocturna_ent", typeof(DateTime)));
            datos.Columns.Add(new DataColumn("hora_nocturna_sal", typeof(DateTime)));
            datos.Columns.Add(new DataColumn("situacion_madrugada", typeof(string)));
            datos.Columns.Add(new DataColumn("situacion_matutina", typeof(string)));
            datos.Columns.Add(new DataColumn("situacion_vespertina", typeof(string)));
            datos.Columns.Add(new DataColumn("situacion_nocturna", typeof(string)));
            datos.Columns.Add(new DataColumn("descripcion_reg_salidas", typeof(string)));
            datos.Columns.Add(new DataColumn("id_huella_fk", typeof(int)));
            datos.Columns.Add(new DataColumn("id_cargahoraria_fk", typeof(int)));
            datos.Columns.Add(new DataColumn("id_empleado_fk", typeof(int)));

            datos.Columns.Add(new DataColumn("total_horas", typeof(string)));
            datos.Columns.Add(new DataColumn("total_horas_ret", typeof(string)));
            datos.Columns.Add(new DataColumn("total_horas_extra", typeof(string)));
            datos.Columns.Add(new DataColumn("total_horas_suple", typeof(string)));
            datos.Columns.Add(new DataColumn("total_horas_permiso", typeof(string)));
            datos.Columns.Add(new DataColumn("total_horas_autorizado", typeof(string)));
            datos.Columns.Add(new DataColumn("subtotal_horas", typeof(DateTime)));

            DataTable dt_salario = new DataTable("ds_salarios");

            dt_salario.Columns.Add(new DataColumn("id_salario", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("estado_salario", typeof(string)));
            dt_salario.Columns.Add(new DataColumn("fecha_registro_salario", typeof(DateTime)));
            dt_salario.Columns.Add(new DataColumn("id_empleado_fk", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("incluye_minutos", typeof(string)));
            dt_salario.Columns.Add(new DataColumn("nro_horas_mes", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("valor_por_salario", typeof(decimal)));
            dt_salario.Columns.Add(new DataColumn("valor_salario", typeof(decimal)));

            dt_salario.Columns.Add(new DataColumn("total_horas_s", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("total_minutos_s", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("total_horas_s_ret", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("total_minutos_s_ret", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("total_horas_s_extra", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("total_minutos_s_extra", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("total_horas_s_suple", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("total_minutos_s_suple", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("total_horas_s_permiso", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("total_minutos_s_permiso", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("total_horas_s_autorizado", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("total_minutos_s_autorizado", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("salario_a_pagar", typeof(decimal)));

            dt_salario.Columns.Add(new DataColumn("vacacion_pagada_minuto", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("vacacion_pagada_hora", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("vacacion_no_pagada_minuto", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("vacacion_no_pagada_hora", typeof(int)));

            int cont = 1;

            double minutos_trab = 0;
            double minutos_total_trab = 0;

            //Es el resto entre la hora final de la carga horaria menos la hora final del registra de salida            
            double minutos_suple = 0;
            double minutos_total_suple = 0;

            //Es el resto entre la hora inicial del registro de entrada menos la hora inicial de la carga horaria            
            double minutos_ret = 0;
            double minutos_total_ret = 0;

            //Es el resto entre la hora final del registro de salida menos la hora final de la carga horaria            
            double minutos_extra = 0;
            double minutos_total_extra = 0;

            //Permisos            
            double minutos_permiso = 0;
            double minutos_total_permiso = 0;

            //Autorizaciones            
            double minutos_autorizado = 0;
            double minutos_total_autorizado = 0;

            List<totales_time> list_regs_trab = new List<totales_time>();

            totales_time reg_aux = new totales_time();
            string[] jornadas = new string[] { "NOCTURNA", "MATUTINA", "VESPERTINA" };

            int sueldo_id_ = 0;

            List<registro_es> reg_list_nocturna = new List<registro_es>();

            for (int j = 0; j < lista_ids.Length; j++)
            {
                if (!lista_ids[j].Equals("0"))
                {
                    minutos_total_trab = 0;
                    minutos_total_suple = 0;
                    minutos_total_ret = 0;
                    minutos_total_extra = 0;
                    minutos_total_permiso = 0;
                    minutos_total_autorizado = 0;

                    DateTime fecha_aux_ini = new DateTime();
                    DateTime fecha_aux_fin = new DateTime();
                    TimeSpan ret_hora_aux;
                    sueldo_id_ = 0;
                    int connnnnnn = 0;

                    empleados emp___ = empleadosBuilder.Recuperar_sin_joins("id_emp=" + lista_ids[j]);

                    for (int i = 0; i < list_fechas.Rows.Count; i++)
                    {
                        fila = datos.NewRow();

                        foreach (string jornad in jornadas)
                        {
                            DateTime fecha_noct_urna = new DateTime();
                            if (!jornad.Equals("NOCTURNA"))
                            {
                                list_registro_es = registro_esBuilder.ListarTodos_List_Join_Horario_Empresa(string.Format("registro_es.id_empleado_fk IN({0}) AND date(fecha_ent_sal)='{1}' AND horario_empresa.jornada='{2}'", lista_ids[j], ValidarBuilder.FormatoFechaSinHoraCompara(list_fechas.Rows[i]["fecha"]), jornad));
                                connnnnnn++;
                            }
                            else
                            {
                                list_registro_es = registro_esBuilder.ListarTodos_List_Join_Horario_Empresa(string.Format("registro_es.id_empleado_fk IN({0}) AND date(fecha_ent_sal)='{1}' AND (HOUR(hora_entrada_ent_sal)>'7') AND horario_empresa.jornada='{2}'", lista_ids[j], ValidarBuilder.FormatoFechaSinHoraCompara(list_fechas.Rows[i]["fecha"]), jornad));

                                if (connnnnnn == 0)
                                {
                                    reg_list_nocturna = registro_esBuilder.ListarTodos_List_Join_Horario_Empresa(string.Format("registro_es.id_empleado_fk IN({0}) AND date(fecha_ent_sal_fin)='{1}' AND (HOUR(hora_entrada_ent_sal)>='0' AND HOUR(hora_entrada_ent_sal)<='7' ) AND horario_empresa.jornada='{2}'", lista_ids[j], ValidarBuilder.FormatoFechaSinHoraCompara(list_fechas.Rows[i]["fecha"]), jornad));
                                    //foreach (registro_es reg_ in reg_list_nocturna)
                                    //    list_registro_es.Add(reg_);
                                    connnnnnn++;

                                    /////////////////////////////////////////////////////////////////////////////////////////////
                                    DataRow dr_fila = datos.NewRow();
                                    for (int g = 0; g < reg_list_nocturna.Count; g++)
                                    {
                                        sueldo_id_ = reg_list_nocturna[g].Id_salario_fk;
                                        ret_hora_aux = reg_list_nocturna[g].Hora_salida_ent_sal - reg_list_nocturna[g].Hora_entrada_ent_sal;
                                        //Horas trabajadas
                                        minutos_trab = minutos_trab + Math.Floor(ret_hora_aux.TotalMinutes);

                                        //Horas de retraso
                                        fecha_aux_ini = new DateTime(reg_list_nocturna[g].Hora_entrada_ent_sal.Year, reg_list_nocturna[g].Hora_entrada_ent_sal.Month, reg_list_nocturna[g].Hora_entrada_ent_sal.Day, reg_list_nocturna[g].Horario_empresa.Hora_inicio_hora.Hour, reg_list_nocturna[g].Horario_empresa.Hora_inicio_hora.Minute, reg_list_nocturna[g].Horario_empresa.Hora_inicio_hora.Second);
                                        ret_hora_aux = reg_list_nocturna[g].Hora_entrada_ent_sal - fecha_aux_ini;

                                        if (g == 0)
                                        {
                                            if (ret_hora_aux.TotalMinutes > 0 && emp___.Emp_entrada_especial.Equals("no"))
                                                minutos_ret = minutos_ret + Math.Floor(ret_hora_aux.TotalMinutes);
                                        }
                                        //Horas extra o suplementaria
                                        fecha_aux_fin = new DateTime(reg_list_nocturna[g].Hora_salida_ent_sal.Year, reg_list_nocturna[g].Hora_salida_ent_sal.Month, reg_list_nocturna[g].Hora_salida_ent_sal.Day, reg_list_nocturna[g].Horario_empresa.Hora_fin_hora.Hour, reg_list_nocturna[g].Horario_empresa.Hora_fin_hora.Minute, reg_list_nocturna[g].Horario_empresa.Hora_fin_hora.Second);
                                        ret_hora_aux = reg_list_nocturna[0].Hora_salida_ent_sal - fecha_aux_fin;

                                        if (ret_hora_aux.TotalMinutes > 0)
                                        {
                                            if (reg_list_nocturna[g].Tipo_trabajo.Equals("EXTRA"))
                                                minutos_extra = minutos_extra + Math.Floor(ret_hora_aux.TotalMinutes);
                                            if (reg_list_nocturna[g].Tipo_trabajo.Equals("SUPLEMENTARIA"))
                                                minutos_suple = minutos_suple + Math.Floor(ret_hora_aux.TotalMinutes);
                                        }
                                        else
                                        {
                                            //Horas permiso o autorizado salida
                                            ret_hora_aux = fecha_aux_fin - reg_list_nocturna[g].Hora_salida_ent_sal;

                                            if (reg_list_nocturna[g].Tipo_trabajo.Equals("PERMISO"))
                                                minutos_permiso = minutos_permiso + Math.Floor(ret_hora_aux.TotalMinutes);
                                            if (reg_list_nocturna[g].Tipo_trabajo.Equals("AUTORIZADO"))
                                                minutos_autorizado = minutos_autorizado + Math.Floor(ret_hora_aux.TotalMinutes);
                                        }

                                        dr_fila["hora_nocturna_ent"] = reg_list_nocturna[0].Hora_entrada_ent_sal;
                                        dr_fila["hora_nocturna_sal"] = reg_list_nocturna[g].Hora_salida_ent_sal;
                                        dr_fila["situacion_nocturna"] = reg_list_nocturna[g].Tipo_ent_sal;

                                        dr_fila["id_ent_sal"] = cont;
                                        dr_fila["fecha_ent_sal"] = reg_list_nocturna[0].Fecha_ent_sal;
                                        dr_fila["id_huella_fk"] = reg_list_nocturna[g].Id_huella_fk; //dt_matutina.Rows[0]["id_huella_fk"];
                                        dr_fila["id_cargahoraria_fk"] = reg_list_nocturna[g].Id_cargahoraria_fk; //dt_matutina.Rows[0]["id_cargahoraria_fk"];
                                        dr_fila["id_empleado_fk"] = reg_list_nocturna[g].Id_empleado_fk; //dt_matutina.Rows[0]["id_empleado_fk"];
                                        //descripcion_reg_salidas
                                        dr_fila["descripcion_reg_salidas"] = dr_fila["descripcion_reg_salidas"] + reg_list_nocturna[g].Descripcion_ent_sal + " ";
                                    }

                                    if (minutos_trab > 0)
                                    {
                                        double min_aux = (minutos_trab / 60);
                                        int new_hour = (int)Math.Floor(min_aux);
                                        int new_minute = (int)minutos_trab % 60;

                                        minutos_total_trab = minutos_total_trab + minutos_trab;
                                        //DateTime total_fecha = new DateTime(fecha_aux_ini.Year, fecha_aux_ini.Month, fecha_aux_ini.Day, new_hour, new_minute, 0);

                                        dr_fila["total_horas"] = new_hour + ":" + new_minute;

                                        //RETRASO
                                        min_aux = (minutos_ret / 60);
                                        new_hour = (int)Math.Floor(min_aux);
                                        new_minute = (int)minutos_ret % 60;

                                        minutos_total_ret = minutos_total_ret + minutos_ret;
                                        //total_fecha = new DateTime(fecha_aux_ini.Year, fecha_aux_ini.Month, fecha_aux_ini.Day, new_hour, new_minute, 0);

                                        if (minutos_ret > 0 && emp___.Emp_entrada_especial.Equals("no"))
                                            dr_fila["total_horas_ret"] = new_hour + ":" + new_minute;

                                        //EXTRA
                                        min_aux = (minutos_extra / 60);
                                        new_hour = (int)Math.Floor(min_aux);
                                        new_minute = (int)minutos_extra % 60;

                                        minutos_total_extra = minutos_total_extra + minutos_extra;
                                        //total_fecha = new DateTime(fecha_aux_ini.Year, fecha_aux_ini.Month, fecha_aux_ini.Day, new_hour, new_minute, 0);

                                        if (minutos_extra > 0)
                                            dr_fila["total_horas_extra"] = new_hour + ":" + new_minute;

                                        //SUPLEMENTARIAS
                                        min_aux = (minutos_suple / 60);
                                        new_hour = (int)Math.Floor(min_aux);
                                        new_minute = (int)minutos_suple % 60;

                                        minutos_total_suple = minutos_total_suple + minutos_suple;
                                        //total_fecha = new DateTime(fecha_aux_ini.Year, fecha_aux_ini.Month, fecha_aux_ini.Day, new_hour, new_minute, 0);

                                        if (minutos_suple > 0)
                                            dr_fila["total_horas_suple"] = new_hour + ":" + new_minute;

                                        //PERMISOS
                                        min_aux = (minutos_permiso / 60);
                                        new_hour = (int)Math.Floor(min_aux);
                                        new_minute = (int)minutos_permiso % 60;

                                        minutos_total_permiso = minutos_total_permiso + minutos_permiso;
                                        //total_fecha = new DateTime(fecha_aux_ini.Year, fecha_aux_ini.Month, fecha_aux_ini.Day, new_hour, new_minute, 0);

                                        if (minutos_permiso > 0)
                                            dr_fila["total_horas_permiso"] = new_hour + ":" + new_minute;

                                        //AUTORIZACIONES SALIDAS
                                        min_aux = (minutos_autorizado / 60);
                                        new_hour = (int)Math.Floor(min_aux);
                                        new_minute = (int)minutos_autorizado % 60;

                                        minutos_total_autorizado = minutos_total_autorizado + minutos_autorizado;
                                        //total_fecha = new DateTime(fecha_aux_ini.Year, fecha_aux_ini.Month, fecha_aux_ini.Day, new_hour, new_minute, 0);

                                        if (minutos_autorizado > 0)
                                            dr_fila["total_horas_autorizado"] = new_hour + ":" + new_minute;

                                        datos.Rows.Add(dr_fila);

                                        minutos_trab = 0;
                                        minutos_ret = 0;
                                        minutos_extra = 0;
                                        minutos_suple = 0;
                                        minutos_permiso = 0;
                                        minutos_autorizado = 0;
                                        cont++;
                                    }
                                    /////////////////////////////////////////////////////////////////////////////////////////////7
                                }

                                fecha_noct_urna = ValidarBuilder.devuelveFechaFin(Convert.ToDateTime(list_fechas.Rows[i]["fecha"]), 1);
                                reg_list_nocturna = registro_esBuilder.ListarTodos_List_Join_Horario_Empresa(string.Format("registro_es.id_empleado_fk IN({0}) AND date(fecha_ent_sal)='{1}' AND (HOUR(hora_entrada_ent_sal)>='0' AND HOUR(hora_entrada_ent_sal)<='7' ) AND horario_empresa.jornada='{2}'", lista_ids[j], ValidarBuilder.FormatoFechaSinHoraCompara(fecha_noct_urna), jornad));

                                foreach (registro_es reg_ in reg_list_nocturna)
                                    list_registro_es.Add(reg_);
                            }
                            for (int g = 0; g < list_registro_es.Count; g++)
                            {
                                sueldo_id_ = list_registro_es[g].Id_salario_fk;
                                ret_hora_aux = list_registro_es[g].Hora_salida_ent_sal - list_registro_es[g].Hora_entrada_ent_sal;
                                //Horas trabajadas
                                minutos_trab = minutos_trab + Math.Floor(ret_hora_aux.TotalMinutes);

                                //Horas de retraso
                                fecha_aux_ini = new DateTime(list_registro_es[g].Hora_entrada_ent_sal.Year, list_registro_es[g].Hora_entrada_ent_sal.Month, list_registro_es[g].Hora_entrada_ent_sal.Day, list_registro_es[g].Horario_empresa.Hora_inicio_hora.Hour, list_registro_es[g].Horario_empresa.Hora_inicio_hora.Minute, list_registro_es[g].Horario_empresa.Hora_inicio_hora.Second);
                                ret_hora_aux = list_registro_es[g].Hora_entrada_ent_sal - fecha_aux_ini;

                                if (g == 0)
                                {
                                    if (ret_hora_aux.TotalMinutes > 0 && emp___.Emp_entrada_especial.Equals("no"))
                                        minutos_ret = minutos_ret + Math.Floor(ret_hora_aux.TotalMinutes);
                                }
                                //Horas extra o suplementaria
                                fecha_aux_fin = new DateTime(list_registro_es[g].Hora_salida_ent_sal.Year, list_registro_es[g].Hora_salida_ent_sal.Month, list_registro_es[g].Hora_salida_ent_sal.Day, list_registro_es[g].Horario_empresa.Hora_fin_hora.Hour, list_registro_es[g].Horario_empresa.Hora_fin_hora.Minute, list_registro_es[g].Horario_empresa.Hora_fin_hora.Second);
                                ret_hora_aux = list_registro_es[0].Hora_salida_ent_sal - fecha_aux_fin;

                                if (ret_hora_aux.TotalMinutes > 0)
                                {
                                    if (list_registro_es[g].Tipo_trabajo.Equals("EXTRA"))
                                        minutos_extra = minutos_extra + Math.Floor(ret_hora_aux.TotalMinutes);
                                    if (list_registro_es[g].Tipo_trabajo.Equals("SUPLEMENTARIA"))
                                        minutos_suple = minutos_suple + Math.Floor(ret_hora_aux.TotalMinutes);
                                }
                                else
                                {
                                    //Horas permiso o autorizado salida
                                    ret_hora_aux = fecha_aux_fin - list_registro_es[g].Hora_salida_ent_sal;

                                    if (list_registro_es[g].Tipo_trabajo.Equals("PERMISO"))
                                        minutos_permiso = minutos_permiso + Math.Floor(ret_hora_aux.TotalMinutes);
                                    if (list_registro_es[g].Tipo_trabajo.Equals("AUTORIZADO"))
                                        minutos_autorizado = minutos_autorizado + Math.Floor(ret_hora_aux.TotalMinutes);
                                }

                                if (jornad.Equals("MATUTINA"))
                                {
                                    fila["hora_matutina_ent"] = list_registro_es[0].Hora_entrada_ent_sal; // dt_matutina.Rows[0]["hora_entrada_ent_sal"];
                                    fila["hora_matutina_sal"] = list_registro_es[g].Hora_salida_ent_sal; //dt_matutina.Rows[0]["hora_salida_ent_sal"];
                                    fila["situacion_matutina"] = list_registro_es[g].Tipo_ent_sal; //dt_matutina.Rows[0]["tipo_ent_sal"];
                                }
                                if (jornad.Equals("VESPERTINA"))
                                {
                                    fila["hora_vespertina_ent"] = list_registro_es[0].Hora_entrada_ent_sal;
                                    fila["hora_vespertina_sal"] = list_registro_es[g].Hora_salida_ent_sal;
                                    fila["situacion_vespertina"] = list_registro_es[g].Tipo_ent_sal;
                                }
                                if (jornad.Equals("NOCTURNA"))
                                {
                                    fila["hora_nocturna_ent"] = list_registro_es[0].Hora_entrada_ent_sal;
                                    fila["hora_nocturna_sal"] = list_registro_es[g].Hora_salida_ent_sal;
                                    fila["situacion_nocturna"] = list_registro_es[g].Tipo_ent_sal;
                                }
                                if (jornad.Equals("MADRUGADA"))
                                {
                                    fila["hora_madrugada_ent"] = list_registro_es[0].Hora_entrada_ent_sal;
                                    fila["hora_madrugada_sal"] = list_registro_es[g].Hora_salida_ent_sal;
                                    fila["situacion_madrugada"] = list_registro_es[g].Tipo_ent_sal;
                                }
                                fila["id_ent_sal"] = cont;
                                fila["fecha_ent_sal"] = list_registro_es[0].Fecha_ent_sal;
                                fila["id_huella_fk"] = list_registro_es[g].Id_huella_fk; //dt_matutina.Rows[0]["id_huella_fk"];
                                fila["id_cargahoraria_fk"] = list_registro_es[g].Id_cargahoraria_fk; //dt_matutina.Rows[0]["id_cargahoraria_fk"];
                                fila["id_empleado_fk"] = list_registro_es[g].Id_empleado_fk; //dt_matutina.Rows[0]["id_empleado_fk"];
                                //descripcion_reg_salidas
                                fila["descripcion_reg_salidas"] = fila["descripcion_reg_salidas"] + list_registro_es[g].Descripcion_ent_sal + " ";
                            }
                        }
                        if (minutos_trab > 0)
                        {
                            double min_aux = (minutos_trab / 60);
                            int new_hour = (int)Math.Floor(min_aux);
                            int new_minute = (int)minutos_trab % 60;

                            minutos_total_trab = minutos_total_trab + minutos_trab;
                            //DateTime total_fecha = new DateTime(fecha_aux_ini.Year, fecha_aux_ini.Month, fecha_aux_ini.Day, new_hour, new_minute, 0);

                            fila["total_horas"] = new_hour + ":" + new_minute;

                            //RETRASO
                            min_aux = (minutos_ret / 60);
                            new_hour = (int)Math.Floor(min_aux);
                            new_minute = (int)minutos_ret % 60;

                            minutos_total_ret = minutos_total_ret + minutos_ret;
                            //total_fecha = new DateTime(fecha_aux_ini.Year, fecha_aux_ini.Month, fecha_aux_ini.Day, new_hour, new_minute, 0);

                            if (minutos_ret > 0 && emp___.Emp_entrada_especial.Equals("no"))
                                fila["total_horas_ret"] = new_hour + ":" + new_minute;

                            //EXTRA
                            min_aux = (minutos_extra / 60);
                            new_hour = (int)Math.Floor(min_aux);
                            new_minute = (int)minutos_extra % 60;

                            minutos_total_extra = minutos_total_extra + minutos_extra;
                            //total_fecha = new DateTime(fecha_aux_ini.Year, fecha_aux_ini.Month, fecha_aux_ini.Day, new_hour, new_minute, 0);

                            if (minutos_extra > 0)
                                fila["total_horas_extra"] = new_hour + ":" + new_minute;

                            //SUPLEMENTARIAS
                            min_aux = (minutos_suple / 60);
                            new_hour = (int)Math.Floor(min_aux);
                            new_minute = (int)minutos_suple % 60;

                            minutos_total_suple = minutos_total_suple + minutos_suple;
                            //total_fecha = new DateTime(fecha_aux_ini.Year, fecha_aux_ini.Month, fecha_aux_ini.Day, new_hour, new_minute, 0);

                            if (minutos_suple > 0)
                                fila["total_horas_suple"] = new_hour + ":" + new_minute;

                            //PERMISOS
                            min_aux = (minutos_permiso / 60);
                            new_hour = (int)Math.Floor(min_aux);
                            new_minute = (int)minutos_permiso % 60;

                            minutos_total_permiso = minutos_total_permiso + minutos_permiso;
                            //total_fecha = new DateTime(fecha_aux_ini.Year, fecha_aux_ini.Month, fecha_aux_ini.Day, new_hour, new_minute, 0);

                            if (minutos_permiso > 0)
                                fila["total_horas_permiso"] = new_hour + ":" + new_minute;

                            //AUTORIZACIONES SALIDAS
                            min_aux = (minutos_autorizado / 60);
                            new_hour = (int)Math.Floor(min_aux);
                            new_minute = (int)minutos_autorizado % 60;

                            minutos_total_autorizado = minutos_total_autorizado + minutos_autorizado;
                            //total_fecha = new DateTime(fecha_aux_ini.Year, fecha_aux_ini.Month, fecha_aux_ini.Day, new_hour, new_minute, 0);

                            if (minutos_autorizado > 0)
                                fila["total_horas_autorizado"] = new_hour + ":" + new_minute;

                            datos.Rows.Add(fila);

                            minutos_trab = 0;
                            minutos_ret = 0;
                            minutos_extra = 0;
                            minutos_suple = 0;
                            minutos_permiso = 0;
                            minutos_autorizado = 0;
                            cont++;
                        }
                        else
                        {
                            minutos_trab = 0;
                            minutos_ret = 0;
                            minutos_extra = 0;
                            minutos_suple = 0;
                            minutos_permiso = 0;
                            minutos_autorizado = 0;
                            cont++;
                        }

                        //sumatoria de vacaciones
                    }
                    salarios salario_empleado = salariosBuilder.Recuperar(string.Format("id_salario='{0}' AND id_empleado_fk='{1}'", sueldo_id_, lista_ids[j]));
                    datos_globales datos_salario_glob = datos_globalesBuilder.Recuperar("id_dat_glob=" + salario_empleado.Id_dat_glob_fk);
                    if (salario_empleado.Id_salario > 0)
                    {
                        fila = dt_salario.NewRow();

                        fila["id_salario"] = salario_empleado.Id_salario;
                        fila["estado_salario"] = salario_empleado.Estado_salario;
                        fila["fecha_registro_salario"] = salario_empleado.Fecha_registro_salario;
                        fila["id_empleado_fk"] = salario_empleado.Id_empleado_fk;
                        fila["incluye_minutos"] = salario_empleado.Incluye_minutos;
                        fila["nro_horas_mes"] = salario_empleado.Nro_horas_mes;
                        fila["valor_por_salario"] = salario_empleado.Valor_por_salario;
                        fila["valor_salario"] = salario_empleado.Valor_salario;

                        double min_aux_total = (minutos_total_trab / 60);
                        int new_hour_total = (int)Math.Floor(min_aux_total);
                        int new_minute_total = (int)minutos_total_trab % 60;
                        int horas_suples_ = 0;
                        int minutos_suples_ = 0;

                        int horas_extras_ = 0;
                        int minutos_extras_ = 0;

                        int horas_trabs_ = 0;
                        int minutos_trabs_ = 0;

                        decimal salario_a_pagar = 0;

                        if (new_hour_total <= salario_empleado.Nro_horas_mes)
                        {
                            salario_a_pagar = (salario_empleado.Valor_salario / (decimal)salario_empleado.Nro_horas_mes) * (decimal)new_hour_total;
                            horas_trabs_ = new_hour_total;
                            minutos_trabs_ = new_minute_total;

                            if (salario_empleado.Incluye_minutos.Equals("si"))
                            {
                                decimal incluye_min = ((salario_empleado.Valor_salario / (decimal)salario_empleado.Nro_horas_mes) / 60) * (decimal)new_minute_total;
                                salario_a_pagar = salario_a_pagar + incluye_min;
                            }
                        }
                        else
                        {
                            salario_a_pagar = salario_empleado.Valor_salario;
                            horas_trabs_ = salario_empleado.Nro_horas_mes;
                            minutos_trabs_ = 0;

                            horas_suples_ = new_hour_total - salario_empleado.Nro_horas_mes;
                            minutos_suples_ = new_minute_total;

                            if (horas_suples_ <= datos_salario_glob.Nro_horas_suplementarias)
                            {
                                decimal valor_suple_horas = (salario_empleado.Valor_salario / (decimal)salario_empleado.Nro_horas_mes) * (1 + (datos_salario_glob.Porcent_suplementaria / 100));
                                decimal aux_suple__ = valor_suple_horas * (decimal)horas_suples_;
                                salario_a_pagar = salario_a_pagar + aux_suple__;

                                if (salario_empleado.Incluye_minutos.Equals("si"))
                                {
                                    decimal valor_suple_minutos = (valor_suple_horas / 60);
                                    aux_suple__ = valor_suple_minutos * (decimal)minutos_suples_;
                                    salario_a_pagar = salario_a_pagar + aux_suple__;
                                }
                            }
                            else
                            {
                                horas_suples_ = datos_salario_glob.Nro_horas_suplementarias;
                                minutos_suples_ = 0;

                                decimal valor_suple_horas = (salario_empleado.Valor_salario / (decimal)salario_empleado.Nro_horas_mes) * (1 + (datos_salario_glob.Porcent_suplementaria / 100));
                                decimal aux_suple__ = valor_suple_horas * (decimal)horas_suples_;
                                salario_a_pagar = salario_a_pagar + aux_suple__;

                                //if (salario_empleado.Incluye_minutos.Equals("si"))
                                //{
                                //    decimal valor_suple_minutos = (salario_empleado.Valor_por_salario / 60) * (decimal)minutos_suples_;
                                //    aux_suple__ = valor_suple_minutos + (valor_suple_minutos * (datos_salario_glob.Porcent_suplementaria / 100));
                                //    salario_a_pagar = salario_a_pagar + aux_suple__;
                                //}

                                horas_extras_ = new_hour_total - (datos_salario_glob.Nro_horas_suplementarias + salario_empleado.Nro_horas_mes);
                                minutos_extras_ = new_minute_total;

                                decimal valor_extra_horas = (salario_empleado.Valor_salario / (decimal)salario_empleado.Nro_horas_mes) * (1 + (datos_salario_glob.Porcent_extra / 100));
                                decimal aux_extra__ = valor_extra_horas * (decimal)horas_extras_;
                                salario_a_pagar = salario_a_pagar + aux_extra__;

                                if (salario_empleado.Incluye_minutos.Equals("si"))
                                {
                                    decimal valor_extra_minutos = (valor_extra_horas / 60);
                                    aux_extra__ = valor_extra_minutos * (decimal)minutos_extras_;
                                    salario_a_pagar = salario_a_pagar + aux_extra__;
                                }
                            }
                        }

                        fila["salario_a_pagar"] = salario_a_pagar;

                        if (horas_trabs_ > 0)
                            fila["total_horas_s"] = horas_trabs_;
                        if (minutos_trabs_ > 0)
                            fila["total_minutos_s"] = minutos_trabs_;

                        //RETRASO
                        min_aux_total = (minutos_total_ret / 60);
                        new_hour_total = (int)Math.Floor(min_aux_total);
                        new_minute_total = (int)minutos_total_ret % 60;

                        if (emp___.Emp_entrada_especial.Equals("no"))
                        {
                            if (new_hour_total > 0)
                                fila["total_horas_s_ret"] = new_hour_total;
                            if (new_minute_total > 0)
                                fila["total_minutos_s_ret"] = new_minute_total;
                        }

                        if (horas_extras_ > 0)
                            fila["total_horas_s_extra"] = horas_extras_;
                        if (minutos_extras_ > 0)
                            fila["total_minutos_s_extra"] = minutos_extras_;

                        if (horas_suples_ > 0)
                            fila["total_horas_s_suple"] = horas_suples_;
                        if (minutos_suples_ > 0)
                            fila["total_minutos_s_suple"] = minutos_suples_;

                        //PERMISO
                        min_aux_total = (minutos_total_permiso / 60);
                        new_hour_total = (int)Math.Floor(min_aux_total);
                        new_minute_total = (int)minutos_total_permiso % 60;

                        if (new_hour_total > 0)
                            fila["total_horas_s_permiso"] = new_hour_total;
                        if (new_minute_total > 0)
                            fila["total_minutos_s_permiso"] = new_minute_total;

                        //AUTORIZACIONES SALIDAS
                        min_aux_total = (minutos_total_autorizado / 60);
                        new_hour_total = (int)Math.Floor(min_aux_total);
                        new_minute_total = (int)minutos_total_autorizado % 60;

                        if (new_hour_total > 0)
                            fila["total_horas_s_autorizado"] = new_hour_total;
                        if (new_minute_total > 0)
                            fila["total_minutos_s_autorizado"] = new_minute_total;

                        dt_salario.Rows.Add(fila);
                    }
                }
            }
            lst_datos[0] = datos;
            lst_datos[1] = dt_salario;

            return lst_datos;
        }

        public static DataTable[] DevuelveRegistroES4(DataTable list_fechas, string[] lista_ids)
        {

            DataRow fila;
            DataTable[] lst_datos = new DataTable[2];

            DataTable datos = new DataTable("ds_resumen_es");
            List<registro_es> list_registro_es;

            datos.Columns.Add(new DataColumn("id_ent_sal", typeof(int)));
            datos.Columns.Add(new DataColumn("fecha_ent_sal", typeof(DateTime)));
            datos.Columns.Add(new DataColumn("hora_madrugada_ent", typeof(DateTime)));
            datos.Columns.Add(new DataColumn("hora_madrugada_sal", typeof(DateTime)));
            datos.Columns.Add(new DataColumn("hora_matutina_ent", typeof(DateTime)));
            datos.Columns.Add(new DataColumn("hora_matutina_sal", typeof(DateTime)));
            datos.Columns.Add(new DataColumn("hora_vespertina_ent", typeof(DateTime)));
            datos.Columns.Add(new DataColumn("hora_vespertina_sal", typeof(DateTime)));
            datos.Columns.Add(new DataColumn("hora_nocturna_ent", typeof(DateTime)));
            datos.Columns.Add(new DataColumn("hora_nocturna_sal", typeof(DateTime)));
            datos.Columns.Add(new DataColumn("situacion_madrugada", typeof(string)));
            datos.Columns.Add(new DataColumn("situacion_matutina", typeof(string)));
            datos.Columns.Add(new DataColumn("situacion_vespertina", typeof(string)));
            datos.Columns.Add(new DataColumn("situacion_nocturna", typeof(string)));
            datos.Columns.Add(new DataColumn("descripcion_reg_salidas", typeof(string)));
            datos.Columns.Add(new DataColumn("id_huella_fk", typeof(int)));
            datos.Columns.Add(new DataColumn("id_cargahoraria_fk", typeof(int)));
            datos.Columns.Add(new DataColumn("id_empleado_fk", typeof(int)));

            datos.Columns.Add(new DataColumn("total_horas", typeof(string)));
            datos.Columns.Add(new DataColumn("total_horas_ret", typeof(string)));
            datos.Columns.Add(new DataColumn("total_horas_extra", typeof(string)));
            datos.Columns.Add(new DataColumn("total_horas_suple", typeof(string)));
            datos.Columns.Add(new DataColumn("total_horas_permiso", typeof(string)));
            datos.Columns.Add(new DataColumn("total_horas_autorizado", typeof(string)));
            datos.Columns.Add(new DataColumn("subtotal_horas", typeof(DateTime)));

            DataTable dt_salario = new DataTable("ds_salarios");

            dt_salario.Columns.Add(new DataColumn("id_salario", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("estado_salario", typeof(string)));
            dt_salario.Columns.Add(new DataColumn("fecha_registro_salario", typeof(DateTime)));
            dt_salario.Columns.Add(new DataColumn("id_empleado_fk", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("incluye_minutos", typeof(string)));
            dt_salario.Columns.Add(new DataColumn("nro_horas_mes", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("valor_por_salario", typeof(decimal)));
            dt_salario.Columns.Add(new DataColumn("valor_salario", typeof(decimal)));

            dt_salario.Columns.Add(new DataColumn("total_horas_s", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("total_minutos_s", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("total_horas_s_ret", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("total_minutos_s_ret", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("total_horas_s_extra", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("total_minutos_s_extra", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("total_horas_s_suple", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("total_minutos_s_suple", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("total_horas_s_permiso", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("total_minutos_s_permiso", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("total_horas_s_autorizado", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("total_minutos_s_autorizado", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("salario_a_pagar", typeof(decimal)));

            dt_salario.Columns.Add(new DataColumn("vacacion_pagada_minuto", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("vacacion_pagada_hora", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("vacacion_no_pagada_minuto", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("vacacion_no_pagada_hora", typeof(int)));

            int cont = 1;

            double minutos_trab = 0;
            double minutos_total_trab = 0;

            //Es el resto entre la hora final de la carga horaria menos la hora final del registra de salida            
            double minutos_suple = 0;
            double minutos_total_suple = 0;

            //Es el resto entre la hora inicial del registro de entrada menos la hora inicial de la carga horaria            
            double minutos_ret = 0;
            double minutos_total_ret = 0;

            //Es el resto entre la hora final del registro de salida menos la hora final de la carga horaria            
            double minutos_extra = 0;
            double minutos_total_extra = 0;

            //Permisos            
            double minutos_permiso = 0;
            double minutos_total_permiso = 0;

            //Autorizaciones            
            double minutos_autorizado = 0;
            double minutos_total_autorizado = 0;

            List<totales_time> list_regs_trab = new List<totales_time>();

            totales_time reg_aux = new totales_time();
            string[] jornadas = new string[] { "NOCTURNA", "MATUTINA", "VESPERTINA" };

            int sueldo_id_ = 0;

            List<registro_es> reg_list_nocturna = new List<registro_es>();

            datos_globales doc_glob_rec = datos_globalesBuilder.Recuperar("estado_dat_glob='VIGENTE'");

            int vaca_paga_horas = 0;
            int vaca_no_paga_horas = 0;

            for (int j = 0; j < lista_ids.Length; j++)
            {
                if (!lista_ids[j].Equals("0"))
                {
                    minutos_total_trab = 0;
                    minutos_total_suple = 0;
                    minutos_total_ret = 0;
                    minutos_total_extra = 0;
                    minutos_total_permiso = 0;
                    minutos_total_autorizado = 0;

                    vaca_paga_horas = 0;
                    vaca_no_paga_horas = 0;

                    DateTime fecha_aux_ini = new DateTime();
                    DateTime fecha_aux_fin = new DateTime();
                    TimeSpan ret_hora_aux;
                    sueldo_id_ = 0;
                    int connnnnnn = 0;

                    empleados emp___ = empleadosBuilder.Recuperar_sin_joins("id_emp=" + lista_ids[j]);

                    for (int i = 0; i < list_fechas.Rows.Count; i++)
                    {
                        fila = datos.NewRow();

                        foreach (string jornad in jornadas)
                        {
                            DateTime fecha_noct_urna = new DateTime();
                            if (!jornad.Equals("NOCTURNA"))
                            {
                                list_registro_es = registro_esBuilder.ListarTodos_List_Join_Horario_Empresa(string.Format("registro_es.id_empleado_fk IN({0}) AND date(fecha_ent_sal)='{1}' AND horario_empresa.jornada='{2}'", lista_ids[j], ValidarBuilder.FormatoFechaSinHoraCompara(list_fechas.Rows[i]["fecha"]), jornad));
                                connnnnnn++;
                            }
                            else
                            {
                                list_registro_es = registro_esBuilder.ListarTodos_List_Join_Horario_Empresa(string.Format("registro_es.id_empleado_fk IN({0}) AND date(fecha_ent_sal)='{1}' AND (HOUR(hora_entrada_ent_sal)>'7') AND horario_empresa.jornada='{2}'", lista_ids[j], ValidarBuilder.FormatoFechaSinHoraCompara(list_fechas.Rows[i]["fecha"]), jornad));

                                if (connnnnnn == 0)
                                {
                                    reg_list_nocturna = registro_esBuilder.ListarTodos_List_Join_Horario_Empresa(string.Format("registro_es.id_empleado_fk IN({0}) AND date(fecha_ent_sal_fin)='{1}' AND (HOUR(hora_entrada_ent_sal)>='0' AND HOUR(hora_entrada_ent_sal)<='7' ) AND horario_empresa.jornada='{2}'", lista_ids[j], ValidarBuilder.FormatoFechaSinHoraCompara(list_fechas.Rows[i]["fecha"]), jornad));
                                    //foreach (registro_es reg_ in reg_list_nocturna)
                                    //    list_registro_es.Add(reg_);
                                    connnnnnn++;

                                    /////////////////////////////////////////////////////////////////////////////////////////////
                                    DataRow dr_fila = datos.NewRow();
                                    for (int g = 0; g < reg_list_nocturna.Count; g++)
                                    {
                                        sueldo_id_ = reg_list_nocturna[g].Id_salario_fk;
                                        ret_hora_aux = reg_list_nocturna[g].Hora_salida_ent_sal - reg_list_nocturna[g].Hora_entrada_ent_sal;
                                        //Horas trabajadas
                                        minutos_trab = minutos_trab + Math.Floor(ret_hora_aux.TotalMinutes);

                                        //Horas de retraso
                                        fecha_aux_ini = new DateTime(reg_list_nocturna[g].Hora_entrada_ent_sal.Year, reg_list_nocturna[g].Hora_entrada_ent_sal.Month, reg_list_nocturna[g].Hora_entrada_ent_sal.Day, reg_list_nocturna[g].Horario_empresa.Hora_inicio_hora.Hour, reg_list_nocturna[g].Horario_empresa.Hora_inicio_hora.Minute, reg_list_nocturna[g].Horario_empresa.Hora_inicio_hora.Second);
                                        ret_hora_aux = reg_list_nocturna[g].Hora_entrada_ent_sal - fecha_aux_ini;

                                        if (g == 0)
                                        {
                                            if (ret_hora_aux.TotalMinutes > 0 && emp___.Emp_entrada_especial.Equals("no"))
                                                minutos_ret = minutos_ret + Math.Floor(ret_hora_aux.TotalMinutes);
                                        }
                                        //Horas extra o suplementaria
                                        fecha_aux_fin = new DateTime(reg_list_nocturna[g].Hora_salida_ent_sal.Year, reg_list_nocturna[g].Hora_salida_ent_sal.Month, reg_list_nocturna[g].Hora_salida_ent_sal.Day, reg_list_nocturna[g].Horario_empresa.Hora_fin_hora.Hour, reg_list_nocturna[g].Horario_empresa.Hora_fin_hora.Minute, reg_list_nocturna[g].Horario_empresa.Hora_fin_hora.Second);
                                        ret_hora_aux = reg_list_nocturna[0].Hora_salida_ent_sal - fecha_aux_fin;

                                        if (ret_hora_aux.TotalMinutes > 0)
                                        {
                                            if (reg_list_nocturna[g].Tipo_trabajo.Equals("EXTRA"))
                                                minutos_extra = minutos_extra + Math.Floor(ret_hora_aux.TotalMinutes);
                                            if (reg_list_nocturna[g].Tipo_trabajo.Equals("SUPLEMENTARIA"))
                                                minutos_suple = minutos_suple + Math.Floor(ret_hora_aux.TotalMinutes);
                                        }
                                        else
                                        {
                                            //Horas permiso o autorizado salida
                                            ret_hora_aux = fecha_aux_fin - reg_list_nocturna[g].Hora_salida_ent_sal;

                                            if (reg_list_nocturna[g].Tipo_trabajo.Equals("PERMISO"))
                                                minutos_permiso = minutos_permiso + Math.Floor(ret_hora_aux.TotalMinutes);
                                            if (reg_list_nocturna[g].Tipo_trabajo.Equals("AUTORIZADO"))
                                                minutos_autorizado = minutos_autorizado + Math.Floor(ret_hora_aux.TotalMinutes);
                                        }

                                        dr_fila["hora_nocturna_ent"] = reg_list_nocturna[0].Hora_entrada_ent_sal;
                                        dr_fila["hora_nocturna_sal"] = reg_list_nocturna[g].Hora_salida_ent_sal;
                                        dr_fila["situacion_nocturna"] = reg_list_nocturna[g].Tipo_ent_sal;

                                        dr_fila["id_ent_sal"] = cont;
                                        dr_fila["fecha_ent_sal"] = reg_list_nocturna[0].Fecha_ent_sal;
                                        dr_fila["id_huella_fk"] = reg_list_nocturna[g].Id_huella_fk; //dt_matutina.Rows[0]["id_huella_fk"];
                                        dr_fila["id_cargahoraria_fk"] = reg_list_nocturna[g].Id_cargahoraria_fk; //dt_matutina.Rows[0]["id_cargahoraria_fk"];
                                        dr_fila["id_empleado_fk"] = reg_list_nocturna[g].Id_empleado_fk; //dt_matutina.Rows[0]["id_empleado_fk"];
                                        //descripcion_reg_salidas
                                        dr_fila["descripcion_reg_salidas"] = dr_fila["descripcion_reg_salidas"] + reg_list_nocturna[g].Descripcion_ent_sal + " ";
                                    }

                                    if (minutos_trab > 0)
                                    {
                                        if (minutos_trab >= 60)
                                            minutos_trab = minutos_trab - 60; //Cambio del dia 22 de Febrero del 2012 para restar las 3 horas de descanso

                                        double min_aux = (minutos_trab / 60);
                                        int new_hour = (int)Math.Floor(min_aux);
                                        int new_minute = (int)minutos_trab % 60;

                                        minutos_total_trab = minutos_total_trab + minutos_trab;
                                        //DateTime total_fecha = new DateTime(fecha_aux_ini.Year, fecha_aux_ini.Month, fecha_aux_ini.Day, new_hour, new_minute, 0);

                                        dr_fila["total_horas"] = new_hour + ":" + new_minute;

                                        //RETRASO
                                        min_aux = (minutos_ret / 60);
                                        new_hour = (int)Math.Floor(min_aux);
                                        new_minute = (int)minutos_ret % 60;

                                        minutos_total_ret = minutos_total_ret + minutos_ret;
                                        //total_fecha = new DateTime(fecha_aux_ini.Year, fecha_aux_ini.Month, fecha_aux_ini.Day, new_hour, new_minute, 0);

                                        if (minutos_ret > 0 && emp___.Emp_entrada_especial.Equals("no"))
                                            dr_fila["total_horas_ret"] = new_hour + ":" + new_minute;

                                        //EXTRA
                                        min_aux = (minutos_extra / 60);
                                        new_hour = (int)Math.Floor(min_aux);
                                        new_minute = (int)minutos_extra % 60;

                                        minutos_total_extra = minutos_total_extra + minutos_extra;
                                        //total_fecha = new DateTime(fecha_aux_ini.Year, fecha_aux_ini.Month, fecha_aux_ini.Day, new_hour, new_minute, 0);

                                        if (minutos_extra > 0)
                                            dr_fila["total_horas_extra"] = new_hour + ":" + new_minute;

                                        //SUPLEMENTARIAS
                                        min_aux = (minutos_suple / 60);
                                        new_hour = (int)Math.Floor(min_aux);
                                        new_minute = (int)minutos_suple % 60;

                                        minutos_total_suple = minutos_total_suple + minutos_suple;
                                        //total_fecha = new DateTime(fecha_aux_ini.Year, fecha_aux_ini.Month, fecha_aux_ini.Day, new_hour, new_minute, 0);

                                        if (minutos_suple > 0)
                                            dr_fila["total_horas_suple"] = new_hour + ":" + new_minute;

                                        //PERMISOS
                                        min_aux = (minutos_permiso / 60);
                                        new_hour = (int)Math.Floor(min_aux);
                                        new_minute = (int)minutos_permiso % 60;

                                        minutos_total_permiso = minutos_total_permiso + minutos_permiso;
                                        //total_fecha = new DateTime(fecha_aux_ini.Year, fecha_aux_ini.Month, fecha_aux_ini.Day, new_hour, new_minute, 0);

                                        if (minutos_permiso > 0)
                                            dr_fila["total_horas_permiso"] = new_hour + ":" + new_minute;

                                        //AUTORIZACIONES SALIDAS
                                        min_aux = (minutos_autorizado / 60);
                                        new_hour = (int)Math.Floor(min_aux);
                                        new_minute = (int)minutos_autorizado % 60;

                                        minutos_total_autorizado = minutos_total_autorizado + minutos_autorizado;
                                        //total_fecha = new DateTime(fecha_aux_ini.Year, fecha_aux_ini.Month, fecha_aux_ini.Day, new_hour, new_minute, 0);

                                        if (minutos_autorizado > 0)
                                            dr_fila["total_horas_autorizado"] = new_hour + ":" + new_minute;

                                        datos.Rows.Add(dr_fila);

                                        minutos_trab = 0;
                                        minutos_ret = 0;
                                        minutos_extra = 0;
                                        minutos_suple = 0;
                                        minutos_permiso = 0;
                                        minutos_autorizado = 0;
                                        cont++;
                                    }
                                    /////////////////////////////////////////////////////////////////////////////////////////////7
                                }

                                fecha_noct_urna = ValidarBuilder.devuelveFechaFin(Convert.ToDateTime(list_fechas.Rows[i]["fecha"]), 1);
                                reg_list_nocturna = registro_esBuilder.ListarTodos_List_Join_Horario_Empresa(string.Format("registro_es.id_empleado_fk IN({0}) AND date(fecha_ent_sal)='{1}' AND (HOUR(hora_entrada_ent_sal)>='0' AND HOUR(hora_entrada_ent_sal)<='7' ) AND horario_empresa.jornada='{2}'", lista_ids[j], ValidarBuilder.FormatoFechaSinHoraCompara(fecha_noct_urna), jornad));

                                foreach (registro_es reg_ in reg_list_nocturna)
                                    list_registro_es.Add(reg_);
                            }
                            for (int g = 0; g < list_registro_es.Count; g++)
                            {
                                sueldo_id_ = list_registro_es[g].Id_salario_fk;
                                ret_hora_aux = list_registro_es[g].Hora_salida_ent_sal - list_registro_es[g].Hora_entrada_ent_sal;
                                //Horas trabajadas
                                minutos_trab = minutos_trab + Math.Floor(ret_hora_aux.TotalMinutes);

                                //Horas de retraso
                                fecha_aux_ini = new DateTime(list_registro_es[g].Hora_entrada_ent_sal.Year, list_registro_es[g].Hora_entrada_ent_sal.Month, list_registro_es[g].Hora_entrada_ent_sal.Day, list_registro_es[g].Horario_empresa.Hora_inicio_hora.Hour, list_registro_es[g].Horario_empresa.Hora_inicio_hora.Minute, list_registro_es[g].Horario_empresa.Hora_inicio_hora.Second);
                                ret_hora_aux = list_registro_es[g].Hora_entrada_ent_sal - fecha_aux_ini;

                                if (g == 0)
                                {
                                    if (ret_hora_aux.TotalMinutes > 0 && emp___.Emp_entrada_especial.Equals("no"))
                                        minutos_ret = minutos_ret + Math.Floor(ret_hora_aux.TotalMinutes);
                                }
                                //Horas extra o suplementaria
                                fecha_aux_fin = new DateTime(list_registro_es[g].Hora_salida_ent_sal.Year, list_registro_es[g].Hora_salida_ent_sal.Month, list_registro_es[g].Hora_salida_ent_sal.Day, list_registro_es[g].Horario_empresa.Hora_fin_hora.Hour, list_registro_es[g].Horario_empresa.Hora_fin_hora.Minute, list_registro_es[g].Horario_empresa.Hora_fin_hora.Second);
                                ret_hora_aux = list_registro_es[0].Hora_salida_ent_sal - fecha_aux_fin;

                                if (ret_hora_aux.TotalMinutes > 0)
                                {
                                    if (list_registro_es[g].Tipo_trabajo.Equals("EXTRA"))
                                        minutos_extra = minutos_extra + Math.Floor(ret_hora_aux.TotalMinutes);
                                    if (list_registro_es[g].Tipo_trabajo.Equals("SUPLEMENTARIA"))
                                        minutos_suple = minutos_suple + Math.Floor(ret_hora_aux.TotalMinutes);
                                }
                                else
                                {
                                    //Horas permiso o autorizado salida
                                    ret_hora_aux = fecha_aux_fin - list_registro_es[g].Hora_salida_ent_sal;

                                    if (list_registro_es[g].Tipo_trabajo.Equals("PERMISO"))
                                        minutos_permiso = minutos_permiso + Math.Floor(ret_hora_aux.TotalMinutes);
                                    if (list_registro_es[g].Tipo_trabajo.Equals("AUTORIZADO"))
                                        minutos_autorizado = minutos_autorizado + Math.Floor(ret_hora_aux.TotalMinutes);
                                }

                                if (jornad.Equals("MATUTINA"))
                                {
                                    fila["hora_matutina_ent"] = list_registro_es[0].Hora_entrada_ent_sal; // dt_matutina.Rows[0]["hora_entrada_ent_sal"];
                                    fila["hora_matutina_sal"] = list_registro_es[g].Hora_salida_ent_sal; //dt_matutina.Rows[0]["hora_salida_ent_sal"];
                                    fila["situacion_matutina"] = list_registro_es[g].Tipo_ent_sal; //dt_matutina.Rows[0]["tipo_ent_sal"];
                                }
                                if (jornad.Equals("VESPERTINA"))
                                {
                                    fila["hora_vespertina_ent"] = list_registro_es[0].Hora_entrada_ent_sal;
                                    fila["hora_vespertina_sal"] = list_registro_es[g].Hora_salida_ent_sal;
                                    fila["situacion_vespertina"] = list_registro_es[g].Tipo_ent_sal;
                                }
                                if (jornad.Equals("NOCTURNA"))
                                {
                                    //if (minutos_trab >= 180)
                                    //    minutos_trab = minutos_trab - 180; //Cambio del dia 22 de Febrero del 2012 para restar las 3 horas de descanso

                                    if (minutos_trab >= doc_glob_rec.Horas_descanso_nocturna)
                                        minutos_trab = minutos_trab - doc_glob_rec.Horas_descanso_nocturna;

                                    fila["hora_nocturna_ent"] = list_registro_es[0].Hora_entrada_ent_sal;
                                    fila["hora_nocturna_sal"] = list_registro_es[g].Hora_salida_ent_sal;
                                    fila["situacion_nocturna"] = list_registro_es[g].Tipo_ent_sal;
                                }
                                if (jornad.Equals("MADRUGADA"))
                                {
                                    fila["hora_madrugada_ent"] = list_registro_es[0].Hora_entrada_ent_sal;
                                    fila["hora_madrugada_sal"] = list_registro_es[g].Hora_salida_ent_sal;
                                    fila["situacion_madrugada"] = list_registro_es[g].Tipo_ent_sal;
                                }
                                fila["id_ent_sal"] = cont;
                                fila["fecha_ent_sal"] = list_registro_es[0].Fecha_ent_sal;
                                fila["id_huella_fk"] = list_registro_es[g].Id_huella_fk; //dt_matutina.Rows[0]["id_huella_fk"];
                                fila["id_cargahoraria_fk"] = list_registro_es[g].Id_cargahoraria_fk; //dt_matutina.Rows[0]["id_cargahoraria_fk"];
                                fila["id_empleado_fk"] = list_registro_es[g].Id_empleado_fk; //dt_matutina.Rows[0]["id_empleado_fk"];
                                //descripcion_reg_salidas
                                fila["descripcion_reg_salidas"] = fila["descripcion_reg_salidas"] + list_registro_es[g].Descripcion_ent_sal + " ";
                            }
                        }
                        if (minutos_trab > 0)
                        {
                            double min_aux = (minutos_trab / 60);
                            int new_hour = (int)Math.Floor(min_aux);
                            int new_minute = (int)minutos_trab % 60;

                            minutos_total_trab = minutos_total_trab + minutos_trab;
                            //DateTime total_fecha = new DateTime(fecha_aux_ini.Year, fecha_aux_ini.Month, fecha_aux_ini.Day, new_hour, new_minute, 0);

                            fila["total_horas"] = new_hour + ":" + new_minute;

                            //RETRASO
                            min_aux = (minutos_ret / 60);
                            new_hour = (int)Math.Floor(min_aux);
                            new_minute = (int)minutos_ret % 60;

                            minutos_total_ret = minutos_total_ret + minutos_ret;
                            //total_fecha = new DateTime(fecha_aux_ini.Year, fecha_aux_ini.Month, fecha_aux_ini.Day, new_hour, new_minute, 0);

                            if (minutos_ret > 0 && emp___.Emp_entrada_especial.Equals("no"))
                                fila["total_horas_ret"] = new_hour + ":" + new_minute;

                            //EXTRA
                            min_aux = (minutos_extra / 60);
                            new_hour = (int)Math.Floor(min_aux);
                            new_minute = (int)minutos_extra % 60;

                            minutos_total_extra = minutos_total_extra + minutos_extra;
                            //total_fecha = new DateTime(fecha_aux_ini.Year, fecha_aux_ini.Month, fecha_aux_ini.Day, new_hour, new_minute, 0);

                            if (minutos_extra > 0)
                                fila["total_horas_extra"] = new_hour + ":" + new_minute;

                            //SUPLEMENTARIAS
                            min_aux = (minutos_suple / 60);
                            new_hour = (int)Math.Floor(min_aux);
                            new_minute = (int)minutos_suple % 60;

                            minutos_total_suple = minutos_total_suple + minutos_suple;
                            //total_fecha = new DateTime(fecha_aux_ini.Year, fecha_aux_ini.Month, fecha_aux_ini.Day, new_hour, new_minute, 0);

                            if (minutos_suple > 0)
                                fila["total_horas_suple"] = new_hour + ":" + new_minute;

                            //PERMISOS
                            min_aux = (minutos_permiso / 60);
                            new_hour = (int)Math.Floor(min_aux);
                            new_minute = (int)minutos_permiso % 60;

                            minutos_total_permiso = minutos_total_permiso + minutos_permiso;
                            //total_fecha = new DateTime(fecha_aux_ini.Year, fecha_aux_ini.Month, fecha_aux_ini.Day, new_hour, new_minute, 0);

                            if (minutos_permiso > 0)
                                fila["total_horas_permiso"] = new_hour + ":" + new_minute;

                            //AUTORIZACIONES SALIDAS
                            min_aux = (minutos_autorizado / 60);
                            new_hour = (int)Math.Floor(min_aux);
                            new_minute = (int)minutos_autorizado % 60;

                            minutos_total_autorizado = minutos_total_autorizado + minutos_autorizado;
                            //total_fecha = new DateTime(fecha_aux_ini.Year, fecha_aux_ini.Month, fecha_aux_ini.Day, new_hour, new_minute, 0);

                            if (minutos_autorizado > 0)
                                fila["total_horas_autorizado"] = new_hour + ":" + new_minute;

                            datos.Rows.Add(fila);

                            minutos_trab = 0;
                            minutos_ret = 0;
                            minutos_extra = 0;
                            minutos_suple = 0;
                            minutos_permiso = 0;
                            minutos_autorizado = 0;
                            cont++;
                        }
                        else
                        {
                            minutos_trab = 0;
                            minutos_ret = 0;
                            minutos_extra = 0;
                            minutos_suple = 0;
                            minutos_permiso = 0;
                            minutos_autorizado = 0;
                            cont++;
                        }

                        //sumatoria de vacaciones

                        string filtro_vaca = string.Format("DATE(fecha_ini_vacacion)<='{0}' AND DATE(fecha_fin_vacacion)>='{0}' AND id_emp_fk='{1}' AND tipo_pago_vacacion='si'", ValidarBuilder.FormatoFechaSinHoraCompara(list_fechas.Rows[i]["fecha"]), lista_ids[j]);
                        vacacion rec_vaca = vacacionBuilder.Recuperar_sin_join(filtro_vaca);

                        if (rec_vaca.Nombre_usu != null)
                        {
                            DateTime dt_comprueba_ = Convert.ToDateTime( list_fechas.Rows[i]["fecha"]);
                            if (!dt_comprueba_.ToLongDateString().Split(',')[0].ToUpper().Equals("SÁBADO") && !dt_comprueba_.ToLongDateString().Split(',')[0].ToUpper().Equals("DOMINGO"))
                                vaca_paga_horas = vaca_paga_horas + 8;
                            else
                            {
                                if (dt_comprueba_.ToLongDateString().Split(',')[0].ToUpper().Equals("SÁBADO"))
                                {
                                    if (emp___.Cat_jor_id_fk_emp == 2)
                                    {
                                        vaca_paga_horas = vaca_paga_horas + 4;
                                        vaca_no_paga_horas = vaca_no_paga_horas + 4;
                                    }
                                    else
                                    {
                                        if (emp___.Cat_jor_id_fk_emp == 1)
                                            vaca_paga_horas = vaca_paga_horas + 8;
                                    }
                                }
                                else
                                {
                                    if (emp___.Cat_jor_id_fk_emp == 1)
                                        vaca_paga_horas = vaca_paga_horas + 8;
                                    else
                                        vaca_no_paga_horas = vaca_no_paga_horas + 8;
                                }
                            }
                        }
                        else
                        {
                            filtro_vaca = string.Format("DATE(fecha_ini_vacacion)<='{0}' AND DATE(fecha_fin_vacacion)>='{0}' AND id_emp_fk='{1}' AND tipo_pago_vacacion='no'", ValidarBuilder.FormatoFechaSinHoraCompara(list_fechas.Rows[i]["fecha"]), lista_ids[j]);

                            if (vacacionBuilder.Existe(filtro_vaca))
                                vaca_no_paga_horas = vaca_no_paga_horas + 8;
                        }
                    }
                    salarios salario_empleado = salariosBuilder.Recuperar(string.Format("id_salario='{0}' AND id_empleado_fk='{1}'", sueldo_id_, lista_ids[j]));
                    datos_globales datos_salario_glob = datos_globalesBuilder.Recuperar("id_dat_glob=" + salario_empleado.Id_dat_glob_fk);
                    if (salario_empleado.Id_salario > 0)
                    {

                        minutos_total_trab = minutos_total_trab + (vaca_paga_horas*60);
                        
                        fila = dt_salario.NewRow();
                        fila["id_salario"] = salario_empleado.Id_salario;
                        fila["estado_salario"] = salario_empleado.Estado_salario;
                        fila["fecha_registro_salario"] = salario_empleado.Fecha_registro_salario;
                        fila["id_empleado_fk"] = salario_empleado.Id_empleado_fk;
                        fila["incluye_minutos"] = salario_empleado.Incluye_minutos;
                        fila["nro_horas_mes"] = salario_empleado.Nro_horas_mes;
                        fila["valor_por_salario"] = salario_empleado.Valor_por_salario;
                        fila["valor_salario"] = salario_empleado.Valor_salario;

                        double min_aux_total = (minutos_total_trab / 60);
                        int new_hour_total = (int)Math.Floor(min_aux_total);
                        int new_minute_total = (int)minutos_total_trab % 60;
                        int horas_suples_ = 0;
                        int minutos_suples_ = 0;

                        int horas_extras_ = 0;
                        int minutos_extras_ = 0;

                        int horas_trabs_ = 0;
                        int minutos_trabs_ = 0;

                        decimal salario_a_pagar = 0;

                        if (new_hour_total <= salario_empleado.Nro_horas_mes)
                        {
                            salario_a_pagar = (salario_empleado.Valor_salario / (decimal)salario_empleado.Nro_horas_mes) * (decimal)new_hour_total; // se cambio el valor de numero de horas por mes a 240 fijos
                            horas_trabs_ = new_hour_total;
                            minutos_trabs_ = new_minute_total;

                            if (salario_empleado.Incluye_minutos.Equals("si"))
                            {
                                decimal incluye_min = ((salario_empleado.Valor_salario / (decimal)salario_empleado.Nro_horas_mes) / 60) * (decimal)new_minute_total;
                                salario_a_pagar = salario_a_pagar + incluye_min;
                            }
                        }
                        else
                        {
                            salario_a_pagar = salario_empleado.Valor_salario;
                            horas_trabs_ = salario_empleado.Nro_horas_mes;
                            minutos_trabs_ = 0;

                            horas_suples_ = new_hour_total - salario_empleado.Nro_horas_mes;
                            minutos_suples_ = new_minute_total;

                            if (horas_suples_ <= datos_salario_glob.Nro_horas_suplementarias)
                            {
                                decimal valor_suple_horas = (salario_empleado.Valor_salario / (decimal)salario_empleado.Nro_horas_mes_calcula) * (1 + (datos_salario_glob.Porcent_suplementaria / 100));
                                decimal aux_suple__ = valor_suple_horas * (decimal)horas_suples_;
                                salario_a_pagar = salario_a_pagar + aux_suple__;

                                if (salario_empleado.Incluye_minutos.Equals("si"))
                                {
                                    decimal valor_suple_minutos = (valor_suple_horas / 60);
                                    aux_suple__ = valor_suple_minutos * (decimal)minutos_suples_;
                                    salario_a_pagar = salario_a_pagar + aux_suple__;
                                }
                            }
                            else
                            {
                                horas_suples_ = datos_salario_glob.Nro_horas_suplementarias;
                                minutos_suples_ = 0;

                                decimal valor_suple_horas = (salario_empleado.Valor_salario / (decimal)salario_empleado.Nro_horas_mes_calcula) * (1 + (datos_salario_glob.Porcent_suplementaria / 100));
                                decimal aux_suple__ = valor_suple_horas * (decimal)horas_suples_;
                                salario_a_pagar = salario_a_pagar + aux_suple__;

                                //if (salario_empleado.Incluye_minutos.Equals("si"))
                                //{
                                //    decimal valor_suple_minutos = (salario_empleado.Valor_por_salario / 60) * (decimal)minutos_suples_;
                                //    aux_suple__ = valor_suple_minutos + (valor_suple_minutos * (datos_salario_glob.Porcent_suplementaria / 100));
                                //    salario_a_pagar = salario_a_pagar + aux_suple__;
                                //}

                                horas_extras_ = new_hour_total - (datos_salario_glob.Nro_horas_suplementarias + salario_empleado.Nro_horas_mes);
                                minutos_extras_ = new_minute_total;

                                decimal valor_extra_horas = (salario_empleado.Valor_salario / (decimal)salario_empleado.Nro_horas_mes_calcula) * (1 + (datos_salario_glob.Porcent_extra / 100));
                                decimal aux_extra__ = valor_extra_horas * (decimal)horas_extras_;
                                salario_a_pagar = salario_a_pagar + aux_extra__;

                                if (salario_empleado.Incluye_minutos.Equals("si"))
                                {
                                    decimal valor_extra_minutos = (valor_extra_horas / 60);
                                    aux_extra__ = valor_extra_minutos * (decimal)minutos_extras_;
                                    salario_a_pagar = salario_a_pagar + aux_extra__;
                                }
                            }
                        }

                        fila["salario_a_pagar"] = salario_a_pagar;

                        if (horas_trabs_ > 0)
                            fila["total_horas_s"] = horas_trabs_;
                        if (minutos_trabs_ > 0)
                            fila["total_minutos_s"] = minutos_trabs_;

                        //RETRASO
                        min_aux_total = (minutos_total_ret / 60);
                        new_hour_total = (int)Math.Floor(min_aux_total);
                        new_minute_total = (int)minutos_total_ret % 60;

                        if (emp___.Emp_entrada_especial.Equals("no"))
                        {
                            if (new_hour_total > 0)
                                fila["total_horas_s_ret"] = new_hour_total;
                            if (new_minute_total > 0)
                                fila["total_minutos_s_ret"] = new_minute_total;
                        }

                        if (horas_extras_ > 0)
                            fila["total_horas_s_extra"] = horas_extras_;
                        if (minutos_extras_ > 0)
                            fila["total_minutos_s_extra"] = minutos_extras_;

                        if (horas_suples_ > 0)
                            fila["total_horas_s_suple"] = horas_suples_;
                        if (minutos_suples_ > 0)
                            fila["total_minutos_s_suple"] = minutos_suples_;

                        //PERMISO
                        min_aux_total = (minutos_total_permiso / 60);
                        new_hour_total = (int)Math.Floor(min_aux_total);
                        new_minute_total = (int)minutos_total_permiso % 60;

                        if (new_hour_total > 0)
                            fila["total_horas_s_permiso"] = new_hour_total;
                        if (new_minute_total > 0)
                            fila["total_minutos_s_permiso"] = new_minute_total;

                        //AUTORIZACIONES SALIDAS
                        min_aux_total = (minutos_total_autorizado / 60);
                        new_hour_total = (int)Math.Floor(min_aux_total);
                        new_minute_total = (int)minutos_total_autorizado % 60;

                        if (new_hour_total > 0)
                            fila["total_horas_s_autorizado"] = new_hour_total;
                        if (new_minute_total > 0)
                            fila["total_minutos_s_autorizado"] = new_minute_total;                       

                        fila["vacacion_pagada_hora"] = vaca_paga_horas;
                        fila["vacacion_pagada_minuto"] = 0;
                        fila["vacacion_no_pagada_hora"] = vaca_no_paga_horas;
                        fila["vacacion_no_pagada_minuto"] = 0;

                        dt_salario.Rows.Add(fila);
                    }
                }
            }
            lst_datos[0] = datos;
            lst_datos[1] = dt_salario;

            return lst_datos;
        }

        public static DataTable[] DevuelveRegistroES4_año(int año, string[] lista_ids)
        {
            DataRow fila;
            DataTable[] lst_datos = new DataTable[2];

            List<registro_es> list_registro_es;
            DataTable dt_salario = new DataTable("ds_salarios_ano");

            dt_salario.Columns.Add(new DataColumn("id_salario", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("estado_salario", typeof(string)));
            dt_salario.Columns.Add(new DataColumn("fecha_registro_salario", typeof(DateTime)));
            dt_salario.Columns.Add(new DataColumn("id_empleado_fk", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("incluye_minutos", typeof(string)));
            dt_salario.Columns.Add(new DataColumn("nro_horas_mes", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("valor_por_salario", typeof(decimal)));
            dt_salario.Columns.Add(new DataColumn("valor_salario", typeof(decimal)));

            dt_salario.Columns.Add(new DataColumn("total_horas_s", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("total_minutos_s", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("total_horas_s_ret", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("total_minutos_s_ret", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("total_horas_s_extra", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("total_minutos_s_extra", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("total_horas_s_suple", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("total_minutos_s_suple", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("total_horas_s_permiso", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("total_minutos_s_permiso", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("total_horas_s_autorizado", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("total_minutos_s_autorizado", typeof(int)));
            dt_salario.Columns.Add(new DataColumn("salario_a_pagar", typeof(decimal)));

            dt_salario.Columns.Add(new DataColumn("salario_enero", typeof(decimal)));
            dt_salario.Columns.Add(new DataColumn("salario_febrero", typeof(decimal)));
            dt_salario.Columns.Add(new DataColumn("salario_marzo", typeof(decimal)));
            dt_salario.Columns.Add(new DataColumn("salario_abril", typeof(decimal)));
            dt_salario.Columns.Add(new DataColumn("salario_mayo", typeof(decimal)));
            dt_salario.Columns.Add(new DataColumn("salario_junio", typeof(decimal)));
            dt_salario.Columns.Add(new DataColumn("salario_julio", typeof(decimal)));
            dt_salario.Columns.Add(new DataColumn("salario_agosto", typeof(decimal)));
            dt_salario.Columns.Add(new DataColumn("salario_septiembre", typeof(decimal)));
            dt_salario.Columns.Add(new DataColumn("salario_octubre", typeof(decimal)));
            dt_salario.Columns.Add(new DataColumn("salario_noviembre", typeof(decimal)));
            dt_salario.Columns.Add(new DataColumn("salario_diciembre", typeof(decimal)));            

            //double minutos_trab = 0;
            double minutos_total_trab = 0;

            //Es el resto entre la hora final de la carga horaria menos la hora final del registra de salida            
            //double minutos_suple = 0;
            //double minutos_total_suple = 0;

            //Es el resto entre la hora inicial del registro de entrada menos la hora inicial de la carga horaria            
            //double minutos_ret = 0;
            double minutos_total_ret = 0;

            //Es el resto entre la hora final del registro de salida menos la hora final de la carga horaria            
            //double minutos_extra = 0;
            //double minutos_total_extra = 0;

            //Permisos            
            //double minutos_permiso = 0;
            double minutos_total_permiso = 0;

            //Autorizaciones            
            //double minutos_autorizado = 0;
            double minutos_total_autorizado = 0;

            List<totales_time> list_regs_trab = new List<totales_time>();

            totales_time reg_aux = new totales_time();
            string[] jornadas = new string[] { "MATUTINA", "VESPERTINA", "NOCTURNA", "MADRUGADA" };

            int sueldo_id_ = 0;

            for (int j = 0; j < lista_ids.Length; j++)
            {
                if (!lista_ids[j].Equals("0"))
                {
                    fila = dt_salario.NewRow();

                    minutos_total_trab = 0;
                    //minutos_total_suple = 0;
                    minutos_total_ret = 0;
                    //minutos_total_extra = 0;
                    minutos_total_permiso = 0;
                    minutos_total_autorizado = 0;

                    DateTime fecha_aux_ini = new DateTime();
                    DateTime fecha_aux_fin = new DateTime();
                    TimeSpan ret_hora_aux;
                    sueldo_id_ = 0;
                    for (int i = 1; i <= 12; i++)
                    {
                        foreach (string jornad in jornadas)
                        {
                            list_registro_es = registro_esBuilder.ListarTodos_List_Join_Horario_Empresa(string.Format("registro_es.id_empleado_fk IN({0}) AND MONTH(fecha_ent_sal)='{1}' AND YEAR(fecha_ent_sal)='{2}' AND horario_empresa.jornada='{3}'", lista_ids[j], i, año, jornad));

                            for (int g = 0; g < list_registro_es.Count; g++)
                            {
                                sueldo_id_ = list_registro_es[g].Id_salario_fk;
                                ret_hora_aux = list_registro_es[g].Hora_salida_ent_sal - list_registro_es[g].Hora_entrada_ent_sal;
                                //Horas trabajadas
                                minutos_total_trab = minutos_total_trab + Math.Floor(ret_hora_aux.TotalMinutes);

                                //Horas de retraso
                                fecha_aux_ini = new DateTime(list_registro_es[g].Hora_entrada_ent_sal.Year, list_registro_es[g].Hora_entrada_ent_sal.Month, list_registro_es[g].Hora_entrada_ent_sal.Day, list_registro_es[g].Horario_empresa.Hora_inicio_hora.Hour, list_registro_es[g].Horario_empresa.Hora_inicio_hora.Minute, list_registro_es[g].Horario_empresa.Hora_inicio_hora.Second);
                                ret_hora_aux = list_registro_es[g].Hora_entrada_ent_sal - fecha_aux_ini;

                                if (g == 0)
                                {
                                    if (ret_hora_aux.TotalMinutes > 0)
                                        minutos_total_ret = minutos_total_ret + Math.Floor(ret_hora_aux.TotalMinutes);
                                }
                                //Horas extra o suplementaria
                                fecha_aux_fin = new DateTime(list_registro_es[g].Hora_salida_ent_sal.Year, list_registro_es[g].Hora_salida_ent_sal.Month, list_registro_es[g].Hora_salida_ent_sal.Day, list_registro_es[g].Horario_empresa.Hora_fin_hora.Hour, list_registro_es[g].Horario_empresa.Hora_fin_hora.Minute, list_registro_es[g].Horario_empresa.Hora_fin_hora.Second);
                                ret_hora_aux = list_registro_es[0].Hora_salida_ent_sal - fecha_aux_fin;

                                if (ret_hora_aux.TotalMinutes > 0)
                                {
                                    //if (list_registro_es[g].Tipo_trabajo.Equals("EXTRA"))
                                    //    minutos_total_extra = minutos_total_extra + Math.Floor(ret_hora_aux.TotalMinutes);
                                    //if (list_registro_es[g].Tipo_trabajo.Equals("SUPLEMENTARIA"))
                                    //    minutos_total_suple = minutos_total_suple + Math.Floor(ret_hora_aux.TotalMinutes);
                                }
                                else
                                {
                                    //Horas permiso o autorizado salida
                                    ret_hora_aux = fecha_aux_fin - list_registro_es[g].Hora_salida_ent_sal;

                                    if (list_registro_es[g].Tipo_trabajo.Equals("PERMISO"))
                                        minutos_total_permiso = minutos_total_permiso + Math.Floor(ret_hora_aux.TotalMinutes);
                                    if (list_registro_es[g].Tipo_trabajo.Equals("AUTORIZADO"))
                                        minutos_total_autorizado = minutos_total_autorizado + Math.Floor(ret_hora_aux.TotalMinutes);
                                }

                            }
                            //string filtro_vaca = string.Format("(MONTH(fecha_ini_vacacion)='{0}' OR MONTH(fecha_fin_vacacion)='{0}') AND id_emp_fk='{1}' AND tipo_pago_vacacion='si'", ValidarBuilder.FormatoFechaSinHoraCompara(list_fechas.Rows[i]["fecha"]), lista_ids[j]);
                            //vacacion rec_vaca = vacacionBuilder.Recuperar_sin_join(filtro_vaca);

                            //if (rec_vaca.Nombre_usu != null)
                            //    vaca_paga_horas = vaca_paga_horas + 8;
                            //else
                            //{
                            //    filtro_vaca = string.Format("DATE(fecha_ini_vacacion)<='{0}' AND DATE(fecha_fin_vacacion)>='{0}' AND id_emp_fk='{1}' AND tipo_pago_vacacion='no'", ValidarBuilder.FormatoFechaSinHoraCompara(list_fechas.Rows[i]["fecha"]), lista_ids[j]);

                            //    if (vacacionBuilder.Existe(filtro_vaca))
                            //        vaca_no_paga_horas = vaca_no_paga_horas + 8;
                            //}
                        }


                        if (minutos_total_trab > 0)
                        {
                            salarios salario_empleado = salariosBuilder.Recuperar(string.Format("id_salario='{0}' AND id_empleado_fk='{1}'", sueldo_id_, lista_ids[j]));
                            datos_globales datos_salario_glob = datos_globalesBuilder.Recuperar("id_dat_glob=" + salario_empleado.Id_dat_glob_fk);
                            if (salario_empleado.Id_salario > 0)
                            {                                
                                fila["id_salario"] = salario_empleado.Id_salario;
                                fila["estado_salario"] = salario_empleado.Estado_salario;
                                fila["fecha_registro_salario"] = salario_empleado.Fecha_registro_salario;
                                fila["id_empleado_fk"] = salario_empleado.Id_empleado_fk;
                                fila["incluye_minutos"] = salario_empleado.Incluye_minutos;
                                fila["nro_horas_mes"] = salario_empleado.Nro_horas_mes;
                                fila["valor_por_salario"] = salario_empleado.Valor_por_salario;
                                fila["valor_salario"] = salario_empleado.Valor_salario;

                                double min_aux_total = (minutos_total_trab / 60);
                                int new_hour_total = (int)Math.Floor(min_aux_total);
                                int new_minute_total = (int)minutos_total_trab % 60;
                                int horas_suples_ = 0;
                                int minutos_suples_ = 0;

                                int horas_extras_ = 0;
                                int minutos_extras_ = 0;

                                int horas_trabs_ = 0;
                                int minutos_trabs_ = 0;

                                decimal salario_a_pagar = 0;

                                if (new_hour_total <= salario_empleado.Nro_horas_mes)
                                {
                                    salario_a_pagar = (salario_empleado.Valor_salario / (decimal)salario_empleado.Nro_horas_mes) * (decimal)new_hour_total;
                                    horas_trabs_ = new_hour_total;
                                    minutos_trabs_ = new_minute_total;

                                    if (salario_empleado.Incluye_minutos.Equals("si"))
                                    {
                                        decimal incluye_min = ((salario_empleado.Valor_salario / (decimal)salario_empleado.Nro_horas_mes) / 60) * (decimal)new_minute_total;
                                        salario_a_pagar = salario_a_pagar + incluye_min;
                                    }
                                }
                                else
                                {
                                    salario_a_pagar = salario_empleado.Valor_salario;
                                    horas_trabs_ = salario_empleado.Nro_horas_mes;
                                    minutos_trabs_ = 0;

                                    horas_suples_ = new_hour_total - salario_empleado.Nro_horas_mes;
                                    minutos_suples_ = new_minute_total;

                                    if (horas_suples_ <= datos_salario_glob.Nro_horas_suplementarias)
                                    {
                                        decimal valor_suple_horas = (salario_empleado.Valor_salario / (decimal)salario_empleado.Nro_horas_mes) * (1 + (datos_salario_glob.Porcent_suplementaria / 100));
                                        decimal aux_suple__ = valor_suple_horas * (decimal)horas_suples_;
                                        salario_a_pagar = salario_a_pagar + aux_suple__;

                                        if (salario_empleado.Incluye_minutos.Equals("si"))
                                        {
                                            decimal valor_suple_minutos = (valor_suple_horas / 60);
                                            aux_suple__ = valor_suple_minutos * (decimal)minutos_suples_;
                                            salario_a_pagar = salario_a_pagar + aux_suple__;
                                        }
                                    }
                                    else
                                    {
                                        horas_suples_ = datos_salario_glob.Nro_horas_suplementarias;
                                        minutos_suples_ = 0;

                                        decimal valor_suple_horas = (salario_empleado.Valor_salario / (decimal)salario_empleado.Nro_horas_mes) * (1 + (datos_salario_glob.Porcent_suplementaria / 100));
                                        decimal aux_suple__ = valor_suple_horas * (decimal)horas_suples_;
                                        salario_a_pagar = salario_a_pagar + aux_suple__;

                                        //if (salario_empleado.Incluye_minutos.Equals("si"))
                                        //{
                                        //    decimal valor_suple_minutos = (salario_empleado.Valor_por_salario / 60) * (decimal)minutos_suples_;
                                        //    aux_suple__ = valor_suple_minutos + (valor_suple_minutos * (datos_salario_glob.Porcent_suplementaria / 100));
                                        //    salario_a_pagar = salario_a_pagar + aux_suple__;
                                        //}

                                        horas_extras_ = new_hour_total - (datos_salario_glob.Nro_horas_suplementarias + salario_empleado.Nro_horas_mes);
                                        minutos_extras_ = new_minute_total;

                                        decimal valor_extra_horas = (salario_empleado.Valor_salario / (decimal)salario_empleado.Nro_horas_mes) * (1 + (datos_salario_glob.Porcent_extra / 100));
                                        decimal aux_extra__ = valor_extra_horas * (decimal)horas_extras_;
                                        salario_a_pagar = salario_a_pagar + aux_extra__;

                                        if (salario_empleado.Incluye_minutos.Equals("si"))
                                        {
                                            decimal valor_extra_minutos = (valor_extra_horas / 60);
                                            aux_extra__ = valor_extra_minutos * (decimal)minutos_extras_;
                                            salario_a_pagar = salario_a_pagar + aux_extra__;
                                        }
                                    }
                                }

                                fila["salario_a_pagar"] = salario_a_pagar;

                                if (horas_trabs_ > 0)
                                    fila["total_horas_s"] = horas_trabs_;
                                if (minutos_trabs_ > 0)
                                    fila["total_minutos_s"] = minutos_trabs_;

                                //RETRASO
                                min_aux_total = (minutos_total_ret / 60);
                                new_hour_total = (int)Math.Floor(min_aux_total);
                                new_minute_total = (int)minutos_total_ret % 60;

                                if (new_hour_total > 0)
                                    fila["total_horas_s_ret"] = new_hour_total;
                                if (new_minute_total > 0)
                                    fila["total_minutos_s_ret"] = new_minute_total;

                                if (horas_extras_ > 0)
                                    fila["total_horas_s_extra"] = horas_extras_;
                                if (minutos_extras_ > 0)
                                    fila["total_minutos_s_extra"] = minutos_extras_;

                                if (horas_suples_ > 0)
                                    fila["total_horas_s_suple"] = horas_suples_;
                                if (minutos_suples_ > 0)
                                    fila["total_minutos_s_suple"] = minutos_suples_;

                                //PERMISO
                                min_aux_total = (minutos_total_permiso / 60);
                                new_hour_total = (int)Math.Floor(min_aux_total);
                                new_minute_total = (int)minutos_total_permiso % 60;

                                if (new_hour_total > 0)
                                    fila["total_horas_s_permiso"] = new_hour_total;
                                if (new_minute_total > 0)
                                    fila["total_minutos_s_permiso"] = new_minute_total;

                                //AUTORIZACIONES SALIDAS
                                min_aux_total = (minutos_total_autorizado / 60);
                                new_hour_total = (int)Math.Floor(min_aux_total);
                                new_minute_total = (int)minutos_total_autorizado % 60;

                                if (new_hour_total > 0)
                                    fila["total_horas_s_autorizado"] = new_hour_total;
                                if (new_minute_total > 0)
                                    fila["total_minutos_s_autorizado"] = new_minute_total;

                                if (i == 1)
                                    fila["salario_enero"] = fila["salario_a_pagar"];
                                if (i == 2)
                                    fila["salario_febrero"] = fila["salario_a_pagar"];
                                if (i == 3)
                                    fila["salario_marzo"] = fila["salario_a_pagar"];
                                if (i == 4)
                                    fila["salario_abril"] = fila["salario_a_pagar"];
                                if (i == 5)
                                    fila["salario_mayo"] = fila["salario_a_pagar"];
                                if (i == 6)
                                    fila["salario_junio"] = fila["salario_a_pagar"];
                                if (i == 7)
                                    fila["salario_julio"] = fila["salario_a_pagar"];
                                if (i == 8)
                                    fila["salario_agosto"] = fila["salario_a_pagar"];
                                if (i == 9)
                                    fila["salario_septiembre"] = fila["salario_a_pagar"];
                                if (i == 10)
                                    fila["salario_octubre"] = fila["salario_a_pagar"];
                                if (i == 11)
                                    fila["salario_noviembre"] = fila["salario_a_pagar"];
                                if (i == 12)
                                    fila["salario_diciembre"] = fila["salario_a_pagar"];

                                minutos_total_trab = 0;
                                //minutos_total_suple = 0;
                                minutos_total_ret = 0;
                                //minutos_total_extra = 0;
                                minutos_total_permiso = 0;
                                minutos_total_autorizado = 0;
                               
                            }
                        }
                        else
                        {
                            minutos_total_trab = 0;
                            //minutos_total_suple = 0;
                            minutos_total_ret = 0;
                            //minutos_total_extra = 0;
                            minutos_total_permiso = 0;
                            minutos_total_autorizado = 0;
                        }
                    }
                    dt_salario.Rows.Add(fila);
                }
            }
            //lst_datos[0] = datos;
            lst_datos[1] = dt_salario;

            return lst_datos;
        }        
    }
}
